2016-03-23 11 views
1

Testklasse ist die Serialisierung wie folgt:Deserialisieren nur erforderliche Felder in Java

public Class Test implements Serializable { 
     private static final long serialVersionUID = GENERATED_LONG_VALUE; 
     private int val; 
     private SomeClass_1 val_1; 
     private SomeClass_2 val_2; 
     private SomeClass_3 val_3; 
     // getter and setter for above 
    } 

Ich habe Gegenstand von oben Klasse als BLOB in Tabelle serialisiert.

Jetzt beim Deserialisieren möchte ich nur val und val_1. Also habe ich readObject() -Methode in Test-Klasse wie unten überschrieben.

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

     this.val = (int) stream.readObject(); 
     this.val_1 = (SomeClass_1) stream.readObject(); 
    } 

Aber nachdem auch dies wird es stream.readObject() für val_3 und val_4 tun. Ich verstehe nicht, warum es passiert, auch ich lese nicht und val_4 in stream.readObject().

P.S. Ich mache Serialisierung auf server X, während Deserialisierung es bei server Y und Klasse Struktur ist genau das gleiche bei server Y wie server X.

+3

Deklarieren Sie die Variablen, die Sie nicht serialisiert wollen [ 'transient'] (http://stackoverflow.com/a/910522/2398375) –

+0

Ich habe diesen Ansatz auch versucht, aber es funktioniert nicht. – Dhairyashil

+0

@VinceEmigh: Während des Serialisierens habe ich alle Felder verwendet, während beim Deserialisieren nur die ersten 2 Felder wiederhergestellt werden sollen. keine anderen Felder. aber es geht immer noch um die Bearbeitung anderer Felder. – Dhairyashil

Antwort

2

Wenn ein Server X alle Mitglieder des Objekts erfordert, um es zu übergeben, aber Server Y nicht der Fall, könnten Sie wollen:

  1. Blick in Externalization. Damit haben Sie die volle Kontrolle über das Marshalling und das Unmarshalling, was Ihrem Bedarf entspricht.

  2. Senden Sie die Server anders proxy objects: Eine, die alle Felder serialisiert, und eine, die nicht funktioniert. Sie können einen Proxy für Daten erstellen, die an die Server gesendet werden sollen, indem Sie das Objekt übergeben, das Sie senden möchten. Ein Proxy verwendet , der andere nicht.

  3. Senden Sie keine Objekte, sondern Daten, die zum Rekonstruieren der Objekte auf der anderen Seite erforderlich sind. Dies entlastet das Netzwerk, wenn die Objekte, die Sie senden möchten, nicht viele Daten benötigen.

+0

Kann ich Serialisierung mit java.io.Serializable und Deserialisierung mit java.io.Externalizable tun? Weil ich bereits serialisierte Daten in DB nicht löschen kann und ich will es wieder bei 'Server Y'. – Dhairyashil

+0

@Dhairyashil Ich habe es noch nie ausprobiert, aber ich habe das Gefühl, dass das zu Problemen führen würde, da 'Serializable' einen bestimmten Algorithmus benutzt, um die Daten zu marshallen und nicht auf beiden Seiten der Verbindung zu folgen auf Lecks. Das ist ein Verdacht, ich habe es selbst nicht probiert, und ich konnte keine Artikel oder Dokumente zu diesem Thema finden.Es könnte Sicherheitsvorkehrungen geben, um Probleme zu vermeiden, aber der einzige Weg, um es herauszufinden, ist aus meiner Sicht, es auszuprobieren und das Netzwerk zu überwachen (wenn keine logischen Probleme auftreten sollten). –

+0

@Dhairyahil Je nachdem, wie viele serialisierte Daten Sie gerade verwalten, können Sie sie immer wieder einlesen und dann mithilfe von Externalisierung verwalten, um sicherzustellen, dass Ihre Systeme konsistent sind. Wenn es zu viel von einem Problem ist, zögern Sie nicht, die zweite Option zu wählen, die ich zur Verfügung gestellt habe. Das ist ein Workaround, von dem ich denke, dass es Ihrer Situation helfen sollte. –

Verwandte Themen