原文地址: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
这样的数据可能就要改变了。对于这样的数据,更建议用另外一种方式来表示,比如字符串。
网友评论