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 には、getter または setter のない public final フィールドがあります。(ゲッターのファンの場合は、フィールドがゲッターで非公開であるふりをしてください。)
また、 MessagePackライブラリを使用してこれらのオブジェクトをシリアル化し、ネットワーク経由で渡したり、ZooKeeper ノードに格納したりしたいと考えています。
問題は、MessagePack が public の非 final フィールドのシリアル化のみをサポートしているため、ビジネス オブジェクトをそのままシリアル化できないことです。また、MessagePack は をサポートしていないため(はい、あなたの s に注釈を追加すればそうですenum
、enum 値をシリアル化するために変換するint
必要があります。String
enum
。以下の私のコメントを参照してください。)
これに対処するために、「メッセージ」オブジェクトの対応する階層を手書きで作成し、各ビジネス オブジェクトとそれに対応するメッセージ オブジェクトとの間で変換を行います。明らかに、これは理想的ではありません。大量のコードの重複が発生し、人的ミスによってフィールドが欠落するなどの可能性があるからです。
この問題に対するより良い解決策はありますか?
- コンパイル時のコード生成?
- 実行時に適切なシリアライズ可能なクラスを生成する方法はありますか?
- MessagePack をあきらめますか?
enum
ビジネス オブジェクトの不変性と s をあきらめますか?- 可変オブジェクト (メッセージ オブジェクト) を不変オブジェクト (ビジネス オブジェクト) にラップできる汎用ラッパー ライブラリはありますか?
MessagePack は (@MessagePackBeans アノテーションを使用して) Java Bean のシリアル化もサポートしているため、不変オブジェクトを Java Bean との間で自動的に変換できれば、解決に近づく可能性があります。