java.io.NotSerializableException 在 net.corda.core.node.services.Vault$ConstraintInfo 上同时在 Corda 上执行任何 VaultQuery

java.io.NotSerializableException on net.corda.core.node.services.Vault$ConstraintInfo while executing any VaultQuery on Corda

net.corda.core.node.services.Vault$ConstraintInfo 上执行任何获取 java.io.NotSerializableException 的 vaultQuery 时,我的 Cordapp 基于 v3.1 和 运行 基于 Corda jar v4.1 构建。我正在使用两者的企业版。

我检查了 ConstraintInfo 属于 Corda 4.x 并且不存在于 3.x 和我 运行 Corda jar v3 上的相同应用程序.1 并且它正在无缝运行。这是兼容性问题吗?或者有什么解决办法吗?

这是我正在执行的 VaultQuery 代码片段:

fun getDummyRequestFromVault(proxy: CordaRPCOps?, lid: String): TransactionState<DummyRequestState> {
        val expr = builder { DummyRequestSchemaV1.DummyRequest::requestId.equal(lid) }
        val criteria = QueryCriteria.VaultCustomQueryCriteria(expr)
        val stateandref = proxy!!.vaultQueryByCriteria(criteria, DummyRequestState::class.java).states.singleOrNull()
                ?: throw Exception("Zero or many states found in vault. Should only be one for this linear ID")
        return stateandref.state
    }

获取 val stateandref 失败,异常:

[ERROR] 2020-07-13T02:43:06,213 [Thread-2 (ActiveMQ-client-global-threads)] org.apache.activemq.artemis.core.client - AMQ214000: Failed to call onMessage
java.io.NotSerializableException: net.corda.core.utilities.Try$Success -> net.corda.core.utilities.Try$Success -> value(java.lang.Object) -> states(java.util.List) -> net.corda.core.node.services.Vault$ConstraintInfo
        at net.corda.serialization.internal.amqp.EvolutionSerializer$Companion.make(EvolutionSerializer.kt:191) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.EvolutionSerializerGetter$getEvolutionSerializer.apply(EvolutionSerializer.kt:299) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.EvolutionSerializerGetter$getEvolutionSerializer.apply(EvolutionSerializer.kt:292) ~[corda-serialization-3.1.jar!/:?]
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1688) ~[?:1.8.0_252]
        at net.corda.serialization.internal.amqp.EvolutionSerializerGetter.getEvolutionSerializer(EvolutionSerializer.kt:297) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.SerializerFactory.getEvolutionSerializer(SerializerFactory.kt:105) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.SerializerFactory.processSchema(SerializerFactory.kt:285) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.SerializerFactory.processSchema$default(SerializerFactory.kt:274) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.SerializerFactory$get.invoke(SerializerFactory.kt:241) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.SerializerFactory$get.invoke(SerializerFactory.kt:55) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.SerializerFactory.get(SerializerFactory.kt:239) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObject$serialization(DeserializationInput.kt:158) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObjectOrNull$serialization(DeserializationInput.kt:136) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.PropertySerializer$DescribedTypePropertySerializer.readProperty(PropertySerializer.kt:92) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.EvolutionSerializer$OldParam.readProperty(EvolutionSerializer.kt:60) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.EvolutionSerializerViaConstructor.readObject(EvolutionSerializer.kt:237) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObject$serialization(DeserializationInput.kt:165) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObjectOrNull$serialization(DeserializationInput.kt:136) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.PropertySerializer$DescribedTypePropertySerializer.readProperty(PropertySerializer.kt:92) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.ObjectSerializer.readObjectBuildViaConstructor(ObjectSerializer.kt:121) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.ObjectSerializer.readObject(ObjectSerializer.kt:103) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObject$serialization(DeserializationInput.kt:165) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.readObjectOrNull$serialization(DeserializationInput.kt:136) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.DeserializationInput$deserialize.invoke(DeserializationInput.kt:113) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.des(DeserializationInput.kt:91) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.DeserializationInput.deserialize(DeserializationInput.kt:108) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.amqp.AbstractAMQPSerializationScheme.deserialize(AMQPSerializationScheme.kt:190) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.SerializationFactoryImpl$deserialize.invoke(SerializationScheme.kt:136) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.core.serialization.SerializationFactory.withCurrentContext(SerializationAPI.kt:77) ~[corda-core-3.1.jar!/:?]
        at net.corda.serialization.internal.SerializationFactoryImpl$deserialize.invoke(SerializationScheme.kt:136) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.serialization.internal.SerializationFactoryImpl$deserialize.invoke(SerializationScheme.kt:106) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.core.serialization.SerializationFactory.asCurrent(SerializationAPI.kt:91) ~[corda-core-3.1.jar!/:?]
        at net.corda.serialization.internal.SerializationFactoryImpl.deserialize(SerializationScheme.kt:136) ~[corda-serialization-3.1.jar!/:?]
        at net.corda.nodeapi.RPCApi$ServerToClient$Companion.fromClientMessage(RPCApi.kt:370) ~[corda-node-api-3.1.jar!/:?]
        at net.corda.client.rpc.internal.RPCClientProxyHandler.artemisMessageHandler(RPCClientProxyHandler.kt:301) ~[corda-rpc-3.1.jar!/:?]
        at net.corda.client.rpc.internal.RPCClientProxyHandler.access$artemisMessageHandler(RPCClientProxyHandler.kt:97) ~[corda-rpc-3.1.jar!/:?]
        at net.corda.client.rpc.internal.RPCClientProxyHandler$initSessions.invoke(RPCClientProxyHandler.kt:503) ~[corda-rpc-3.1.jar!/:?]
        at net.corda.client.rpc.internal.RPCClientProxyHandler$initSessions.invoke(RPCClientProxyHandler.kt:97) ~[corda-rpc-3.1.jar!/:?]
        at net.corda.client.rpc.internal.RPCClientProxyHandlerKt$sam$org_apache_activemq_artemis_api_core_client_MessageHandler[=13=].onMessage(RPCClientProxyHandler.kt) ~[corda-rpc-3.1.jar!/:?]
        at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.callOnMessage(ClientConsumerImpl.java:1003) ~[artemis-core-client-2.4.0.jar!/:2.4.0]
        at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.access0(ClientConsumerImpl.java:50) ~[artemis-core-client-2.4.0.jar!/:2.4.0]
        at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl$Runner.run(ClientConsumerImpl.java:1126) [artemis-core-client-2.4.0.jar!/:2.4.0]
        at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:42) [artemis-commons-2.4.0.jar!/:2.4.0]
        at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:31) [artemis-commons-2.4.0.jar!/:2.4.0]
        at org.apache.activemq.artemis.utils.actors.ProcessorBase$ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar!/:2.4.0]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_252]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_252]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252]

我认为这个问题是因为 Corda 4 中的 RPC 序列化机制更新。您可能需要将客户端模块的 rpc 客户端库升级到 v4.1。

https://docs.corda.net/docs/corda-os/4.5/release-notes.html#rpc-upgrades