在 Java 中,我想使用不可变 POJO 的层次结构来表达我的领域模型。
例如
final ServiceId id = new ServiceId(ServiceType.Foo, "my-foo-service")
final ServiceConfig cfg = new ServiceConfig("localhost", 8080, "abc", JvmConfig.DEFAULT)
final ServiceInfo info = new ServiceInfo(id, cfg)
所有这些 POJO 都有公共的 final 字段,没有 getter 或 setter。(如果您是 getter 的粉丝,请假装这些字段对 getter 是私有的。)
我还想使用MessagePack库序列化这些对象,以便通过网络传递它们,将它们存储到 ZooKeeper 节点等。
问题是 MessagePack 仅支持公共的非最终字段的序列化,因此我无法按原样序列化业务对象。MessagePack 也不支持(是的,如果您在enum
,所以我必须将枚举值转换为序列化int
或String
序列化。enum
s 中添加注释,则可以。请参阅下面的评论。)
为了解决这个问题,我有一个手写的“消息”对象的相应层次结构,每个业务对象与其对应的消息对象之间都有转换。显然这并不理想,因为它会导致大量重复代码,并且人为错误可能会导致丢失字段等。
这个问题有更好的解决方案吗?
- 在编译时生成代码?
- 在运行时生成适当的可序列化类的某种方式?
- 放弃 MessagePack?
- 放弃
enum
我的业务对象中的不变性和 s? - 是否有某种通用包装库可以将可变对象(消息对象)包装成不可变对象(业务对象)?
MessagePack 还支持 Java Bean 的序列化(使用 @MessagePackBeans 注释),因此如果我可以自动将不可变对象转换为 Java Bean 或从 Java Bean 转换,那可能会让我更接近解决方案。