医生;tl;dr;
我需要corda从jdk序列化jsonObject。我怀疑我可以为它添加一个自定义的解析器,但我不知道该怎么做。
完整故事:
所以我有很多类在JSONAPI周围充当semy类型的安全包装器。一个例子:
@CordaSerializable
class ClaimReq(val json: JSONObject) {
val proverDid: String = json.getString("prover_did")
val credDefId: String = json.getString("cred_def_id")
}
当我试图通过Corda频道发送这样一个类时,问题出现了。系统在序列化org.json.jsonObject时出现问题:
java.io.NotSerializableException:没有为类org.json.jsonObject找到用于反序列化的构造函数。
at net.corda.node api.internal.serialization.amqp.serializationHelperkt.constructorDeserialization(serializationHelper.kt:50)~[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.fingerprintforobject(schema.kt:456)~[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.access$fingerprintforobject(schema.kt:1)~[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt$fingerprintfortype$3.invoke(schema.kt:423)~[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt$fingerprintformtype$3.invoke(schema.kt)~[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.fingerprintwicustomserializatiorrelse(schema.kt:345)~[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.fingerprintformype(schema.kt:417)【corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.fingerprintforobject(schema.kt:459)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.access$fingerprintforobject(schema.kt:1)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt$fingerprintfortype$3.invoke(schema.kt:423)【corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt$fingerprintfortype$3.invoke(schema.kt)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.fingerprintwicustomserializatiorrelse(schema.kt:345)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.fingerprintformype(schema.kt:417)【corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.fingerprintformtype$default(schema.kt:352)【corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.schema kt.fingerprintformype(schema.kt:328)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.objectserializer。(objectserializer.kt:34)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializerfactory$makeClassSerializer$1.apply(serializerfactory.kt:271)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializerfactory$makeClassSerializer$1.apply(serializerfactory.kt:40)[corda-node-api-3.1-corda.jar:?]
在Java.UTI.CONTROR.CONCURESTHASMMAP。:1.8.0_171]
at net.corda.node api.internal.serialization.amqp.serializerfactory.makeClassSerializer(serializerfactory.kt:255)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializerfactory.get(serializerfactory.kt:100)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationOutput.writeObject$node_api(serializationOutput.kt:98)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationOutput.writeObject$node_api$default(serializationOutput.kt:97)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationOutput.writeObject$node_api(serializationOutput.kt:78)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationOutput$序列化$1$1.invoke(serializationOutput.kt:64)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationOutput$序列化$1$1.invoke(serializationOutput.kt:22)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationHelperkt.withList(serializationHelper.kt:401)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationOutput$序列化$1.invoke(serializationOutput.kt:63)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationOutput$序列化$1.invoke(serializationOutput.kt:22)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationhelper kt.withdescribed(serializationhelper.kt:390)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationOutput.\u serialization$node_api(serializationOutput.kt:62)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.serializationOutput.serialization(serializationOutput.kt:36)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.amqp.abstractAmqSerializationScheme.serialization(amqSerializationScheme.kt:128)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.serializationFactoryImpl$serialization$1$1.invoke(serializationScheme.kt:126)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.serializationFactoryImpl$serialization$1$1.invoke(serializationScheme.kt:86)[corda-node-api-3.1-corda.jar:?]
at net.corda.core.serialization.serializationFactory.withCurrentContext(serializationapi.kt:66)[corda-core-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.serializationFactoryImpl$serialization$1.invoke(serializationScheme.kt:126)[corda-node-api-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.serializationFactoryImpl$serialization$1.invoke(serializationScheme.kt:86)[corda-node-api-3.1-corda.jar:?]
at net.corda.core.serialization.serializationFactory.ascurrent(serializationapi.kt:80)[corda-core-3.1-corda.jar:?]
at net.corda.node api.internal.serialization.serializationFactoryImpl.serialization(序列化方案.kt:126)[corda-node-api-3.1-corda.jar:?]
at net.corda.core.serialization.serializationapi kt.serialization(serializationapi.kt:221)[corda-core-3.1-corda.jar:?]
at net.corda.core.serialization.serializationapi kt.serialization$默认值(serializationapi.kt:220)[corda-core-3.1-corda.jar:?]
at net.corda.node.services.statemachine.flowstateMachineImpl.createSessionData(flowstateMachineImpl.kt:353)[corda-node-3.1-corda.jar:?]
at net.corda.node.services.statemachine.flowstateMachineImpl.send(flowstateMachineImpl.kt:235)[corda-node-3.1-corda.jar:?]
at net.corda.node.services.statemachine.flowssessionimpl.send(flowssessionimpl.kt:52)[corda-node-3.1-corda.jar:?]
at net.corda.node.services.statemachine.flowssessionimpl.send(flowssessionimpl.kt:56)[corda-node-3.1-corda.jar:?]
在com.luxoft.blockchainlab.corda.hyperledger.indy.flow.issueclaimflow$prover.call(issueclaimflow.kt:85)上[主/:?]
在com.luxoft.blockchainlab.corda.hyperledger.indy.flow.issueclaimflow$prover.call(issueclaimflow.kt:71)[主/:?]
at net.corda.node.services.statemachine.flowstateMachineImpl.run(flowstateMachineImpl.kt:96)[corda-node-3.1-corda.jar:?]
at net.corda.node.services.statemachine.flowstateMachineImpl.run(flowstateMachineImpl.kt:44)[corda-node-3.1-corda.jar:?]
在C.RuleSuth.Fix.Fiel.Run1(Field.Java:1092)[CasAR-CARE-0.7.9JDK8. jar:0.7.9]
在CO.RealWorks.Fix.Fix.Exc(Field.Java:788)[CasAR-CARE-0.7.9JDK8. jar:0.7.9]
所以我修复了scspecific构造函数和getter的问题:
@CordaSerializable
class ClaimReq(val json: JSONObject) {
val proverDid: String = json.getString("prover_did")
val credDefId: String = json.getString("cred_def_id")
@ConstructorForDeserialization constructor(str: String) : this(JSONObject(str))
val str = json.toString()
}
不幸的是,该解决方案需要在每个类声明中添加2行。我有什么办法能把它抽象出来,就像在超级课堂上一样吗?或者我可以用一个定制的parser扩展corda序列化来支持
JSONObject
?