Kryo Configuration

Reuse Object Pools

1
2
3
4
5
6
7
8
9
10
11
12
13
//  一般对象
kryo.register(Event::class.java, object : FieldSerializer<Event>(kryo, Event::class.java) {
override fun create(kryo: Kryo?, input: Input?, type: Class<Event>?): Event {
return Pools.borrow(Event::class.java)
}
})

// List对象
kryo.register(ReferenceArrayList::class.java, object :CollectionSerializer() {
override fun create(kryo: Kryo?, input: Input?, type: Class<MutableCollection<Any?>>?): MutableCollection<Any?> {
return Pools.borrow(ReferenceArrayList::class.java) as ReferenceArrayList<Any>
}
})

Ignore Field

1
@field:FieldSerializer.Optional("ignored")

Note

  • 对于跨服务进行序列化的类,不论是发送方还是接收方,都需要对该类进行注册。先注册父类,再注册父类里面嵌套的子类。标准库的类不需要注册,比如MutableList等等。
  • 如果先注册子类,再注册父类,可能会造成接收方反序列化失败。
  • 在Kotlin中,如果A类和B类字段一样,如果A类被Open修饰,B类没有Open修饰,使用B类反序列化A类的数据是失败的。A类会因为Open关键字造成序列化出来的数据多个Byte。

Register List

1
2
3
4
5
6
7
8
9
10
11
// A类
{
timestamp: Long
list: MutableList<C>
}

// B类
{
price: Long
list: MutableList<D>
}

虽然A类和B类中的list的元素类型不同,但是都用到了MutableList(其他List类型同样),因此在序列化或反序列的时候,用不同的SerializerUtil对象来注册和使用。

  • aSerializerUtilInstance负责注册A类,序列化和反序列化A类;
  • bSerializerUtilInstance负责注册B类,序列化和反序列化B类