<Property name="serializablePolicyCmpts" value="true"/>
Generatoroptionen
Serialization & IRuntimeRepositoryLookup
Generatoroption serializablePolicyCmpts
Wird die Option serializablePolicyCmpts
aktiviert, werden alle Vertragsklassen so generiert, dass sie java.io.Serializable
implementieren.
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.