Corda - 通过 RPC 传递匿名实现

Corda - Passing Anonymous Implementations Over RPC

是否可以通过 Corda 的 RPC 接口传递匿名对象实现? - 例如:

工作流程

@CordaSerializable
interface ExampleInterface {
    val number: Int
}

@StartableByRPC
class SquareFlow(private val example: ExampleInterface) : FlowLogic<Int>() {
    
    @Suspendable
    override fun call(): Int = example.number * example.number
}

RPC 客户端

val value = object : ExampleInterface {
    override val number: Int = 5
}

return rpc.startFlowDynamic(SquareFlow::class.java, value).returnValue.getOrThrow()

异常

net.corda.client.rpc.RPCException: java.util.List<*> -> Unable to create an object serializer for type class com.example.client.ExampleService$square$value: No unique deserialization constructor can be identified

Either annotate a constructor for this type with @ConstructorForDeserialization, or provide a custom serializer for it

虽然这是一个示例,但我真正想做的是通过 RPC 传递 object : TypeReference<SomeType>(){}

根据 Corda 的文档,他们的 AMQP 不支持匿名对象 RPC 客户端中使用的序列化,您可以阅读 here。这可能是由于我想序列化和反序列化需要 public 构造函数。

此外,我假设您引用的是 Jackson 的 TypeReference class,它使用仅在编译时可用的泛型。由于 Corda 序列化的工作方式,泛型在运行时将不可用,因此当 TypeReference 从 rpc 应用程序传递到 corda 节点时,corda 节点将不知道泛型是什么。我自己还没有尝试过,但我相信每当流程尝试暂停或可能之前在 RPC 客户端中暂停时,都会抛出一些异常。

你可以毫无问题地将一个 jackson JavaType class 传递给一个流,因为我相信它在 Corda 中被默认列为可序列化的白名单,如果不是,请查看如何将 class here 使用 SerializationWhitelist。您可以通过实例化一个 TypeFactory 并调用 constructType(new TypeReference<SomeType> {}) 来获得 JavaType。然后只需将 JavaType 传递给您的流程构造函数。