该注解的作用:
1.用于简单情况确定字段的实现类型,以实现精确解析
impl()。
2.读写代理可以让用户对字段进行细粒度的控制,eg:多态问题,读写替换问题,lazyDecode...
value的应用场景
impl()属性用于简单多态解决方案。
1.非顶层接口的抽象Map和Collection的精确解析,用户指定实现类可调用实现类的构造方法创建实例。
2.非抽象类(包含自定义)类也可以指定实现类,在解码时可替换为子类实例。
读写代理的应用场景
读写代理可以实现字段的高自由度读写。 1.可以解决上面提到的多态问题。 2.可以实现字段的读写替换:由于需要自行调用writeStart,因此可以替换要写入的内容。 3.可以实现字段的延迟解析:通过DsonObjectReader.readValueAsBytes(String) -- 目前仅二进制编解码接口提供支持,
4.字段读后的转换:如果字段的默认解码类型不符合要求,可以在读写代理中处理。
5.可用于通知注解处理器不自动读或写
多层嵌套类型
举个栗子:Map<Integer, Map<String,Object>>
对于这种类型,要想通过声明的泛型信息精确解析是很困难的,而且泛型参数很可能是抽象的。
要想简单可靠的解决这个问题,用户需要让泛型对应的实例尽可能在CodecRegistry中,
运行时类型在CodecRegistry中的对象是可以精确解析的。- 作者:
- wjybxx date 2023/3/31
-
可选元素概要
可选元素修饰符和类型可选元素说明int用于声明子类型,项目可以定义一个自己的常量类DsonType.BINARY数据关联的DsonType,配合dsonSubType()使用 1.可声明 byte[] 的子类型 2.可将普通的int32/int64/double/string声明为带标签的对应结构指定字段的getter方法,避免由于字段名特殊或特殊封装情况下无法自动序列化的问题Class<?> 字段的实现类,用于生成factory。用于文档型序列化时字段名数字类型字段的文本格式对象类型字段的文本格式 1.读代理:自定义读方法 1.指定字段的setter方法字符串类型字段的文本格式数字类型属性的编码格式 设定合适的类型有助于优化二进制编码,修改该值不产生兼容性问题。写代理:自定义写方法。
-
元素详细资料
-
name
String name用于文档型序列化时字段名- 默认值:
""
-
getter
String getter指定字段的getter方法,避免由于字段名特殊或特殊封装情况下无法自动序列化的问题- 默认值:
""
-
setter
String setter指定字段的setter方法- 默认值:
""
-
wireType
WireType wireType数字类型属性的编码格式 设定合适的类型有助于优化二进制编码,修改该值不产生兼容性问题。- 默认值:
VARINT
-
dsonType
DsonType dsonType数据关联的DsonType,配合dsonSubType()使用 1.可声明 byte[] 的子类型 2.可将普通的int32/int64/double/string声明为带标签的对应结构- 默认值:
END_OF_OBJECT
-
dsonSubType
int dsonSubType用于声明子类型,项目可以定义一个自己的常量类DsonType.BINARY- 默认值:
0
-
numberStyle
NumberStyle numberStyle数字类型字段的文本格式- 默认值:
SIMPLE
-
stringStyle
StringStyle stringStyle字符串类型字段的文本格式- 默认值:
AUTO
-
objectStyle
ObjectStyle[] objectStyle对象类型字段的文本格式 1. 该属性只有显式声明才有效,当未声明该属性时,将使用目标类型的默认格式。 2. 只有第一个值有效。Q:为什么是数组类型? A:如果不需要支持运行时,那么就不需要定义为数组,因为apt是可以分辨是否是默认值的。 但如果要支持运行时判断是否是默认值,就需要判断是否为null; 但java的注解不支持属性为null,推荐的方案是使用空数组代替。
- 默认值:
{}
-
impl
Class<?> impl字段的实现类,用于生成factory。限制
1. 必须是具体类型,必须拥有public无参构造方法 -- 生成的代码可访问。 2. 自定义类型也可以指定实现类。 3. 使用readProxy()时忽略该属性。PS:Java的注解必须是常量,因此不能直接使用
TypeName- 默认值:
java.lang.Object.class
-
writeProxy
String writeProxy写代理:自定义写方法。1. 如果是由
DsonCodecLinkerBean映射的类,则表示静态方法代理,否则为普通实例方法代理。 2. writer的类型限定为DsonObjectWriter3. 对于需要特殊编解码的字段是很有用的。两种代理的方法签名示例:
// 实例方法代理 public void writeName(DsonObjectWriter writer, String name) { writer.writeString(name, this.name); } // 静态方法代理 public static void writeName(T inst, DsonObjectWriter writer, String name) { writer.writeString(name, this.name); }- 默认值:
""
-
readProxy
String readProxy读代理:自定义读方法 1. 如果是由DsonCodecLinkerBean映射的类,则表示静态方法代理,否则为普通实例方法代理。 2. Reader参数限定为DsonObjectReader3. 对于有特殊构造过程的字段是很有帮助的,也可以进行类型转换。示例:
// 实例方法代理 public void readName(DsonObjectReader reader, String name) { this.name = reader.readString(name); } // 静态方法代理 public static void readName(T inst, DsonObjectReader reader, String name) { this.name = reader.readString(name); }- 默认值:
""
-