2016-05-26 11 views
0

Ich habe eine Hierarchie von Domänenklassen in meiner Webanwendung, die ich serialisieren möchte. Alle Domänenklassen erben von einer abstrakten Basisklasse. Ich plane, readObject und writeObject in der abstrakten Basisklasse zu überschreiben. Gibt es eine Möglichkeit, alle Unterklassen für die Serialisierung auf die Superklasse zu verschieben, damit Unterklassen ihre eigenen Felder nicht serialisieren?Java - Handle Serialisierung nur in der Oberklasse

Ich verwende FST Serialization - Wenn das oben in Java nicht möglich ist, gibt es eine Möglichkeit, sagen Sie zum Beispiel, eine "Serialisierungsstrategie" für Objekte eines bestimmten Typs?

public abstract class Base implements Serializable { 

    private void writeObject(java.io.ObjectOutputStream stream) 
     throws IOException { 
     ... 
    } 

    private void readObject(java.io.ObjectInputStream stream) 
     throws IOException, ClassNotFoundException { 
     ... 
    } 
} 

public class Person extends Base { 

    // I don't want Person class to do anything for serialization 
} 

Update: Ich habe mehr als hundert Unterklassen, jede Unterklasse hat mehrere Felder. Diese Klassen bilden das Domänenmodell in meiner Webanwendung. Ich hatte gehofft, einen leichteren Weg zu finden, anders zu handeln, als transient auf jedem Feld in jeder Klasse zu spezifizieren.

Hintergrund: Ich serialisieren Sitzungsstatus, um das Speichern auf einem Cache-Server zu ermöglichen. Unser Sitzungsobjekt enthält Verweise auf Domänenobjekte. Anstatt das gesamte Domänenobjekt zu speichern, hoffte ich, nur einen Teil des Domänenobjekts zu speichern und es neu zu konstruieren, wenn das Sitzungsobjekt auf einen anderen Server "zurückgeworfen" wurde.

Antwort

1

Gibt es eine Möglichkeit, alle Unterklassen auf die Superklasse für die Serialisierung zu verschieben, damit Unterklassen ihre eigenen Felder nicht serialisieren?

können Sie tun, um diese auf die gleiche Weise ein beliebiges Feld fragen nicht serialisiert werden: alle Felder in der Unterklasse machen transient (oder static).

Aber das ist eine ziemlich Einschränkung für die Unterklassen, und eine Belastung für den Programmierer zu erinnern, alle Felder transient machen, und in gewissem Sinne macht Felder in den Unterklassen von begrenzter Verwendung. Überlegen Sie sorgfältig, warum Sie versuchen, Unterklassenfelder, die serialisiert werden, zu stoppen.

+0

Ich habe Hunderte von Unterklassen in meiner Klassenhierarchie, plus jede Unterklasse haben mehrere Felder, so wird es ziemlich mühsam sein .. Aber basierend auf was ich bisher gelesen habe, scheint es wie meine einzige Option. – citress

+0

Warum möchten Sie nicht, dass der Status der Unterklassen serialisiert wird? Wenn das Feld in der Klasse für die korrekte Funktionsweise der Klasse erforderlich ist, warum brauchen Sie es nach der Deserialisierung nicht? und wenn es nicht notwendig ist, warum das Feld an erster Stelle? –

+0

Wir verwenden ein proprietäres ORM-Framework - alle Felder in unseren Domain-Klassen sind benutzerdefinierte "Field" -Klassen, nicht java.lang.String usw. Diese Field-Klassen holen Daten von der Datenbank, wenn sie nicht in der lokalen Kopie existieren. Also war mein erster Gedanke, nur den Primärschlüssel des Domänenobjekts zu serialisieren und sich auf "faules Holen" zu verlassen, um das Objekt zu füllen, wenn es bei der Deserialisierung benötigt wird. Ich erkannte jedoch, dass diese Annahme bedeutet, dass wenn ein Domain-Objekt in einem anderen App-Server deserialisiert wird, es immer die neuesten Daten aus der Datenbank darstellt. Dies ist möglicherweise keine gültige Annahme. – citress