代码之家  ›  专栏  ›  技术社区  ›  voddan

为第三方类扩展corda序列化

  •  0
  • voddan  · 技术社区  · 6 年前

    医生;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 ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Joel    6 年前

    由corda框架序列化的具有多个构造函数的任何类都需要用一个构造函数进行注释。 @ConstructorForDeserialization . 显然,在 JSONObject .

    您需要为 J主题 类。请参见此处定义自定义序列化程序的示例: https://docs.corda.net/head/cordapp-custom-serializers.html#example .

    如果此序列化程序位于类路径上,则节点将在运行时使用它。