Tried to marshall a Parcel that contained Binder objects.
When passing a ParcelFileDescriptor
object with Metadata headers
, the following error occurred:
41333: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: java.lang.IllegalStateException: java.lang.RuntimeException: Tried to marshall a Parcel that contained Binder objects.
41334: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.internal.ServerImpl$ServerTransportListenerImpl$1HandleServerCall.runInternal(ServerImpl.java:617)
41335: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.internal.ServerImpl$ServerTransportListenerImpl$1HandleServerCall.runInContext(ServerImpl.java:603)
41336: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
41337: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133)
41338: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
41339: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
41340: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at java.lang.Thread.run(Thread.java:920)
41341: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: Caused by: java.lang.RuntimeException: Tried to marshall a Parcel that contained Binder objects.
41342: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at android.os.Parcel.nativeMarshall(Native Method)
41343: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at android.os.Parcel.marshall(Parcel.java:621)
41344: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.binder.internal.ParcelableInputStream.getDelegateStream(ParcelableInputStream.java:102)
41345: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.binder.internal.ParcelableInputStream.read(ParcelableInputStream.java:116)
41346: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at com.google.common.io.ByteStreams.toByteArrayInternal(ByteStreams.java:191)
41347: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at com.google.common.io.ByteStreams.toByteArray(ByteStreams.java:238)
41348: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.Metadata.streamToBytes(Metadata.java:1046)
41349: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.Metadata.access$1300(Metadata.java:58)
41350: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.Metadata$LazyValue.toBytes(Metadata.java:942)
41351: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.Metadata.valueAsBytes(Metadata.java:183)
41352: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.Metadata.toString(Metadata.java:554)
41353: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at java.lang.String.valueOf(String.java:2924)
41354: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at java.lang.StringBuilder.append(StringBuilder.java:132)
41355: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at dragon.grpc.server.HeaderServerInterceptor.interceptCall(HeaderServerInterceptor.java:22)
41356: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.ServerInterceptors$InterceptCallHandler.startCall(ServerInterceptors.java:269)
41357: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.binder.internal.BinderTransportSecurity$ServerAuthInterceptor.interceptCall(BinderTransportSecurity.java:88)
41358: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.ServerInterceptors$InterceptCallHandler.startCall(ServerInterceptors.java:269)
41359: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.internal.ServerImpl$ServerTransportListenerImpl.startWrappedCall(ServerImpl.java:701)
41360: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.internal.ServerImpl$ServerTransportListenerImpl.access$2200(ServerImpl.java:408)
41361: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: at io.grpc.internal.ServerImpl$ServerTransportListenerImpl$1HandleServerCall.runInternal(ServerImpl.java:613)
41362: 06-04 14:31:22.203 29205 29349 E SerializingExecutor: ... 6 more
This is because grpc-binder
will use Parcel.marshall
to serialize Metadata headers
into a byte array. But ParcelFileDescriptor
cannot be serialized into a byte array, it can only be passed through Parcel.writeParcelable
, and then send the Parcel
object to the peer.
Is there any way to solve this problem or any other solution?
Can grpc-binder only pass non-binder Parcelable
objects?