MisterChangRay / magic-byte

a java tool for faster convertor byte2object
BSD 3-Clause "New" or "Revised" License
49 stars 20 forks source link

动态嵌套对象的序列化和反序列化 #30

Closed FULaBUla closed 11 months ago

FULaBUla commented 11 months ago

根据我需要,我分数据头和数据体两部分,头的格式是固定的,数据体根据也不同结构也不一样,我能否直接通过仅在一个对象里封装头和数据体,来进行序列化和反序列化,就像下面代码的样子。或者别的方法来实现动态选择不同的数据体格式做序列化和反序列化?我不想先从二进制解出来一个头,然后拿着剩余的二进制数据再判断解析数据体,太麻烦了。

注:我知道 readme 写了不支持 Object,所以我下面的代码里给 Object 加个自定义转换器的注解,能否实现动态序列化转换?

@MagicClass(byteOrder = ByteOrder.BIG_ENDIAN)
public class School {
    // 一个对象
    @MagicField(order = 1)
    private Header header;

    @MagicField(order = 3)
    @MagicConverter()
    private Object age;

}
MisterChangRay commented 11 months ago

可以的, dataBody对象建议定义一个接口,所有数据体继承,不要使用object

FULaBUla commented 11 months ago

可以的, dataBody对象建议定义一个接口,所有数据体继承,不要使用object

  1. 能麻烦给个例子吗,是指大家都实现同一个接口类比使用 Object 更规范?也好管理,避免强制转换类型出问题吗?
  2. 我看到了自定义序列化 wiki 里讲的序列化未知类型,感觉跟我的需求还不太一样,我是需要用 Header 里的数据才能知道 DataBody 到底是啥,没法直接用 attachParams 来指定,然后 DataBody 的长度也是在 Header 里存的,那还有办法搞嘛?是不是只能从 fullBytes 里自己偏移读取了?
    // 注意这里 attachParams  参数修改为 4 了,上一个示例为 3; 另外这个属性对象为Object,这样在自定义解析中就可以返回任意对象了
    @MagicConverter(converter = CustomBookConverter.class, attachParams = "4")
    @MagicField(order = 3)
    private Object book;
MisterChangRay commented 11 months ago

可以的, dataBody对象建议定义一个接口,所有数据体继承,不要使用object

  1. 能麻烦给个例子吗,是指大家都实现同一个接口类比使用 Object 更规范?也好管理,避免强制转换类型出问题吗?
  2. 我看到了自定义序列化 wiki 里讲的序列化未知类型,感觉跟我的需求还不太一样,我是需要用 Header 里的数据才能知道 DataBody 到底是啥,没法直接用 attachParams 来指定,然后 DataBody 的长度也是在 Header 里存的,那还有办法搞嘛?是不是只能从 fullBytes 里自己偏移读取了?
   // 注意这里 attachParams  参数修改为 4 了,上一个示例为 3; 另外这个属性对象为Object,这样在自定义解析中就可以返回任意对象了
    @MagicConverter(converter = CustomBookConverter.class, attachParams = "4")
    @MagicField(order = 3)
    private Object book;

好的,计划在下个版本增加消息委托。这样就可以直接返回消息实体

FULaBUla commented 11 months ago

可以的, dataBody对象建议定义一个接口,所有数据体继承,不要使用object

  1. 能麻烦给个例子吗,是指大家都实现同一个接口类比使用 Object 更规范?也好管理,避免强制转换类型出问题吗?
  2. 我看到了自定义序列化 wiki 里讲的序列化未知类型,感觉跟我的需求还不太一样,我是需要用 Header 里的数据才能知道 DataBody 到底是啥,没法直接用 attachParams 来指定,然后 DataBody 的长度也是在 Header 里存的,那还有办法搞嘛?是不是只能从 fullBytes 里自己偏移读取了?
   // 注意这里 attachParams  参数修改为 4 了,上一个示例为 3; 另外这个属性对象为Object,这样在自定义解析中就可以返回任意对象了
    @MagicConverter(converter = CustomBookConverter.class, attachParams = "4")
    @MagicField(order = 3)
    private Object book;

好的,计划在下个版本增加消息委托。这样就可以直接返回消息实体

谢谢大佬!