Javaでは、私のドメインモデルを表現するために不変なPOJOの階層を使用したいと思います。不変のビジネスオブジェクトとMessagePackメッセージの自動変換
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はパブリックな非最終フィールドのシリアル化しかサポートしないため、ビジネスオブジェクトをそのままシリアル化することができないということです。
また、MessagePackは
(これは、enum
をサポートしていないので、enum値を
int
または
String
にシリアル化する必要があります。
enum
に注釈を追加した場合です。
これに対処するために、私はそれぞれのビジネスオブジェクト間の変換を伴う、 "メッセージ"オブジェクトの手書きの対応する階層を持っています対応するメッセージオブジェクト明らかにこれは理想的ではありません。重複したコードが大量に発生し、人為的なエラーによりフィールドが失われる可能性があります。
この問題の解決策はありますか?
- コンパイル時のコード生成?
- 実行時に適切なシリアライズ可能なクラスを生成するいくつかの方法はありますか?
- MessagePackをあきらめますか?
- 不変性をあきらめて、私のビジネスオブジェクトに
enum
を入れますか? - 変更可能なオブジェクト(メッセージオブジェクト)を不変のオブジェクト(ビジネスオブジェクト)にラップできる汎用ラッパーライブラリがありますか?私は自動的に近いソリューションに私を得ることがJava Beanが、へ/から不変オブジェクトに変換することができますので、もし
はMessagePackはまた、Javaの豆のシリアライズ(@MessagePackBeansアノテーションを使用)をサポートしています。
[@OrdinalEnum](https://github.com/msgpack/msgpack-java/blob/master/src/main)を追加すると、MessagePackが 'enum'タイプをサポートできることを試行錯誤で発見しました。 /java/org/msgpack/annotation/OrdinalEnum.java)アノテーションをすべてのenumに追加します。 @Delegate注釈が何をしているのかを今すぐ解説してください... –