美文网首页Corda 学习
R3 Corda: 升级 CorDapp(非平台版本升级)- 序

R3 Corda: 升级 CorDapp(非平台版本升级)- 序

作者: 李甲川 | 来源:发表于2018-09-08 15:07 被阅读0次

原文地址:https://docs.corda.net/upgrading-cordapps.html#serialisation

当前,所有的序列化格式除了 flow checkpoints(使用 Kryo-based 格式) 以外都是基于 AMQP 1.0,一个自描述(self-describing)和可控的序列化格式。AMQP 是正确的选择因为除了被序列化的数据本身,它允许我们可以定义一个 schema 来描述什么被序列化了。

编写类

虽然并不是跟版本有着很严格的联系,AMQP 序列化要求我们要以一种特别的方式来编写我们的类:

  • 你的类必须要有个构造器,这个构造器需要有你所有想要以被序列化的形式记录的所有属性。之所以需要这样是为了序列化框架能够重现你的类的实例
  • 如果提供了不止一个构造器的话,序列化框架需要知道应该使用哪一个。@ConstructorForDeserialization 注解可以用来指定选择的构造器。对于一个没有 @ConstructorForDeserialization 注解的 Kotlin 的类,主的构造器会被选择
  • 类必须要含有 .class 文件中的参数名字,从而被编译。这在 Kotlin 中是默认的但是在 Java 中必须要被开启(对于 javac 使用 -parameters 命令行选项)
  • 你的类对于在构造器中的每个属性都需要提供一个 Java Bean getter,而且名字要跟构造器中的一样。比如,如果一个类含有一个构造器参数 foo,那么必须要有一个名字为 getFoo() 的 getter。如果 foo 是一个 boolean 类型的,那么 getter 可能需要被命名为 isFoo()。这也是为什么类必须要以将参数名字开启的方式被编译
  • 类必须要有 @CordaSerializable 的注解
  • 必须要支持针对于构造器参数/getters 定义的类型,当有 generics 被使用的时候, generic 参数也必须是一个被支持的类型,一个打开的通配符(*)或者一个现在对一个打开的通配符进行扩展的有限的通配符
    *任何的超级类(superclass)也必须要遵循这个原则,但是可以是个抽象类
  • 对象 graph 周期当前还不支持,所以一个对象是不能够直接或间接的引用它自己的

编写枚举 enums

在一个新版本的代码中元素是没有办法被添加到枚举中的。因此,枚举仅仅针对于永远不会改变(比如一周的天数)的静态数据是适用的。Buy 或者 Sell 标志是另外一个例子。但是,像类似于 Trade Type 或者 Currency Code 这样的数据可能就要改变了。对于这样的数据,更建议用另外一种方式来表示,比如字符串。

相关文章

网友评论

    本文标题:R3 Corda: 升级 CorDapp(非平台版本升级)- 序

    本文链接:https://www.haomeiwen.com/subject/snnkgftx.html