Corda 为什么要在Cordof节点中设置序列化上下文?

Corda 为什么要在Cordof节点中设置序列化上下文?,corda,Corda,最近,当我想在节点外用证书签名时,我得到了以下例外情况: 原因:java.lang.IllegalStateException:应正好为1 {nodeSerializationEnv,globalSerializationEnv, contextSerializationEnv,inheritableContextSerializationEnv}但得到: {} 在调试时,我发现它首先被序列化,然后被签名。因此,我必须设置序列化上下文以使其序列化和签名 我对为什么需要它的理解有限。我知道P2P

最近,当我想在节点外用证书签名时,我得到了以下例外情况:

原因:java.lang.IllegalStateException:应正好为1 {nodeSerializationEnv,globalSerializationEnv, contextSerializationEnv,inheritableContextSerializationEnv}但得到: {}

在调试时,我发现它首先被序列化,然后被签名。因此,我必须设置序列化上下文以使其序列化和签名


我对为什么需要它的理解有限。我知道P2P和RPC调用需要不同的上下文,但我不完全确定是否有人可以向我提供一些背景信息。

您用于签署证书的内部库要求先序列化证书。反过来,这要求您指定序列化上下文。序列化上下文定义了在各种情况下如何执行序列化,如P2P、客户端RPC、服务器端RPC、存储和检查点

请注意,这些序列化上下文是在运行节点或一组节点测试时自动设置的。您之所以会遇到此问题,是因为您在预期使用的上下文之外使用内部库

在您的情况下,您可能应该使用
globalSerializationEnv
,这是用于模拟节点和使用节点驱动程序创建的节点的序列化环境
nodeSerializationEnv
由节点本身使用,
contextSerializationEnv
inheritableContextSerializationEnv
用于各种平台测试

出于教育目的,查看节点启动时如何设置其序列化框架可能会有所帮助(请参阅):

nodeSerializationEnv = SerializationEnvironmentImpl(
    SerializationFactoryImpl().apply {
        registerScheme(KryoServerSerializationScheme())
        registerScheme(AMQPServerSerializationScheme(cordappLoader.cordapps))
    },
    p2pContext = AMQP_P2P_CONTEXT.withClassLoader(classloader),
    rpcServerContext = KRYO_RPC_SERVER_CONTEXT.withClassLoader(classloader),
    storageContext = AMQP_STORAGE_CONTEXT.withClassLoader(classloader),
    checkpointContext = KRYO_CHECKPOINT_CONTEXT.withClassLoader(classloader))