-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Mix-In Annotation实现思路 #1
Comments
对于存储方案选择,我是想集中维护Map会好一些,写两处维护成本会提高 |
这两天我试着根据方案2写了一版MixInAnnotations的实现,大致思路如下:
一句话总结就是:“在类、方法、属性获取注解时先从MixIn类中获取,并将对应信息写入到序列化/反序列化所需要的beaninfo中。” |
后面证实第5步的问题不应该被考虑,因为这一步不做,只会影响到一个场景:用户先使用了序列化/反序列化功能,然后进行了mixin类的配置,之后又进行了序列化/反序列化。而按照jackson官方说法,最佳实践应该是先配置后使用,而不是使用后才配置。 |
关于实现Mix-In Annotation的想法:
首先需要一个用于存储Target Class -> Mix-In Class映射关系的数据结构(类似Jackson的objectMapper),目前想到两个方案:
在SerializeConfig与ParserConfig中各自定义一个Map类型的成员变量,并提供相应的公共函数供用户向其中插入/删除映射关系。
在JSON类中定义一个Map类型的全局静态单例类变量,并提供相应的公共函数供用户向其中插入/删除映射关系。
这样做的好处是:
大致思路:
在序列化时先尝试从Map中获取相应的MixIn类,如果有事先配置好的MixIn类,则优先将MixIn类中定义的注解信息写入到SerializeConfig的成员属性以及生成的SerializeBeanInfo -> ObjectSerializer中。(个人理解是序列化需要的注解信息都写入到了ObjectSerializer里)
在反序列化时先尝试从Map中获取相应的MixIn类,如果有事先配置好的MixIn类,则通过asm/反射将MixIn类中定义的注解信息写入生成的JavaBeanInfo -> ObjectDeserializer中(个人理解是反序列化需要的所有注解信息最终都写入到了ObjectDeserializer里)。
思考:是否可以通过重载TypeUtils.getAnnotations方法来统一化所有场景(获取类注解、属性注解、方法注解)的注解获取函数?这么一来,只需要在这些重载的方法内做Target类与MixIn类的注解合并即可。
使用示例:
现在有一个Java类Rectangle(Target Class),定义如下
其对应的MixIn类(Mix-In Class),定义如下:
使用场景如下:
方案1:
方案2:
存疑:
关于Target Class与Mix-In Class中注解的优先级,有以下三种方案(个人倾向第1种):
是否需要支持父子Mix-In Class注解继承?(类似于现有的Target Class父子注解继承)
参考资料:
https://github.com/FasterXML/jackson-docs/wiki/JacksonMixInAnnotations
The text was updated successfully, but these errors were encountered: