En Java, j'aimerais utiliser des hiérarchies de POJO immuables pour exprimer mon modèle de domaine.
par exemple
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)
Tous ces POJO ont des champs publics finaux sans getters ni setters. (Si vous êtes un fan des getters, prétendez que les champs sont privés avec des getters).
J'aimerais également sérialiser ces objets à l'aide de la fonction MessagePack afin de les faire circuler sur le réseau, de les stocker sur des nœuds ZooKeeper, etc.
Le problème est que MessagePack ne prend en charge que la sérialisation des champs publics, non finaux, de sorte que je ne peux pas sérialiser les objets commerciaux tels quels. De plus, MessagePack ne prend pas en charge (Oui, c'est le cas, si vous ajoutez une annotation à votre enum
Je dois donc convertir les valeurs de l'énumération en int
o String
pour la sérialisation.enum
s. Voir mon commentaire ci-dessous).
Pour y remédier, j'ai rédigé à la main une hiérarchie correspondante d'objets "messages", avec des conversions entre chaque objet métier et son objet message correspondant. Il est évident que cette méthode n'est pas idéale, car elle entraîne une grande quantité de code dupliqué, et une erreur humaine peut entraîner des champs manquants, etc.
Existe-t-il de meilleures solutions à ce problème ?
- Génération de code au moment de la compilation ?
- Comment générer les classes sérialisables appropriées au moment de l'exécution ?
- Abandonner MessagePack ?
- Renoncer à l'immutabilité et
enum
dans mes objets commerciaux ? - Existe-t-il une sorte de bibliothèque générique capable d'envelopper un objet mutable (l'objet message) dans un objet immuable (l'objet métier) ?
MessagePack prend également en charge la sérialisation des Java Beans (en utilisant l'annotation @MessagePackBeans), de sorte que si je peux convertir automatiquement un objet immuable vers/depuis un Java Bean, cela pourrait me rapprocher d'une solution.