Generatoroptionen

Serialization & IRuntimeRepositoryLookup

Generatoroption serializablePolicyCmpts

Wird die Option serializablePolicyCmpts aktiviert, werden alle Vertragsklassen so generiert, dass sie java.io.Serializable implementieren.

   <Property name="serializablePolicyCmpts" value="true"/>

In allen Klassen wird eine private static final long serialVersionUID = 1 L generiert. Da normalerweise alle Maschinen mit der gleichen Modellversion laufen und die Serialisierung nicht zur Langzeitarchivierung genutzt wird, ist eine Anpassung auch bei Änderungen am Modell nicht notwendig. Sollten doch auch alte Stände deserialisiert werden müssen, sollte dieses Field auf /** @generated NOT */ gestellt und inkrementiert werden sowie ggf. in readObject manuell behandelt werden.

IRuntimeRepositoryLookup

Produktkonfigurierte Vertragsklassen haben ein Field private ProductConfiguration productConfiguration. In der ProductConfiguration werden Referenzen zum verwendeten IProductComponent und ggf. auch IProductComponentGeneration gehalten. Da jeder Produktbaustein auch das Repository kennt, würde dieses ohne weitere Vorkehrungen mit jedem Produktbaustein serialisiert und beim deserialisieren eine weitere Instanz des kompletten Repositories erstellt. Da Repositories normalerweise (je Sparte) Singletons sind, soll bei der Deserialisierung nicht ein neues Repository erstellt, sondern das auf der jeweiligen Maschine bereits vorhandene genutzt werden. Zu diesem Zweck kann am Repository ein IRuntimeRepositoryLookup gesetzt werden. Eine Implementierung dieses Interfaces muss serialisierbar sein und dafür sorgen, dass das passende Repository gefunden wird. Wird dann ein Vertragsobjekt serialisiert, wird lediglich das Lookup-Objekt serialisiert und deserialisiert, das Repository selbst nicht.

Default-Implementierung für ClassloaderRuntimeRepositories

Ein ClassloaderRuntimeRepository wird mit dem Pfad zum zugehörigen Table-of-Contents (z. B. "org/faktorips/sample/internal/faktorips-repository-toc.xml") initialisiert. Es genügt, diesen Pfad zu serialisieren, um das gleiche Repository wiederzufinden, was in ClassloaderRuntimeRepository#withLookup() implementiert ist. Beim Aufruf dieser Methode wird ein RuntimeRepositoryLookupByToC instanziiert und gesetzt.

Dabei ist zu beachten, dass referenzierte Repositories nicht mit serialisiert werden – eine Deserialisierung auf einem blanken System würde also z. B. lediglich das Sparten-Produkt-Repository instantiieren, ohne ein spartenübergreifendes Repository zu referenzieren. Darum empfehlen wir, auf jedem System erst die passenden Repository-Singletons zu erstellen und verknüpfen (und an ihnen withLookup() aufzurufen), bevor Vertragsobjekte deserialisiert werden.