Wann sollten wir die serialisierbare Schnittstelle implementieren?

153
public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. Wann sollte ich die SerializableSchnittstelle implementieren ?
  2. Warum machen wir das?
  3. Gibt es irgendwelche Vorteile oder Sicherheit?
theJava
quelle
1
Zu Ihrer Information, die hier akzeptierte Antwort ist unvollständig und irreführend, da sie die Sicherheitsnachteile nicht behebt. Siehe Effektives Java , Punkt 86: Implementieren Sie Serializable mit großer Vorsicht. Raedwalds Antwort hier , keine Serialisierung zu verwenden, ist die richtige.
Nathan Hughes

Antworten:

157
  1. Von Was ist die „Serialisierung“ Sache über allem? ::

    Sie können ein Objekt oder eine Gruppe von Objekten aufnehmen, auf eine Festplatte legen oder über einen drahtgebundenen oder drahtlosen Transportmechanismus senden und später, möglicherweise auf einem anderen Computer, den Vorgang umkehren: die ursprünglichen Objekte wiederbeleben. Die grundlegenden Mechanismen bestehen darin, Objekte in einen eindimensionalen Bitstrom zu reduzieren und diesen Bitstrom wieder in die ursprünglichen Objekte umzuwandeln.

    Wie beim Transporter auf Star Trek geht es darum, etwas Kompliziertes in eine flache Folge von Einsen und Nullen umzuwandeln, dann diese Folge von Einsen und Nullen (möglicherweise an einem anderen Ort, möglicherweise zu einer anderen Zeit) zu nehmen und das ursprüngliche Komplizierte zu rekonstruieren. " etwas."

    Implementieren Sie die SerializableSchnittstelle, wenn Sie eine Kopie des Objekts speichern müssen, und senden Sie sie an einen anderen Prozess, der auf demselben System oder über das Netzwerk ausgeführt wird.

  2. Weil Sie ein Objekt speichern oder senden möchten.

  3. Es erleichtert das Speichern und Senden von Objekten. Es hat nichts mit Sicherheit zu tun.

Moinudin
quelle
4
Ist es eine bewährte Methode, eine seriablizble Schnittstelle für alle Domänenmodelle zu implementieren ...
theJava
8
@theJava Es geht nicht um Best Practices. Es ist eine Frage, ob Sie eine Reihe von Bytes benötigen oder nicht.
Moinudin
5
Wenn Sie JSON verwenden, müssen Sie diese Schnittstelle nicht implementieren und können diese Zeichenfolge einfach senden. Daher bin ich mir immer noch nicht sicher, warum Sie diese Schnittstelle verwenden sollen, wenn Sie JSON verwenden können.
Yonatan Nir
1
@YonatanNir Ich bin mir nicht sicher, warum man JSON verwenden sollte, wenn MsgPack, Avro, Thrift oder Protobuf für die E / A-Übertragung besser sind.
OneCricketeer
1
@YonatanNir Ein streng definiertes Schema ist besser. Und JSON soll für Menschen lesbar sein, während binär codierte Formate über das
Kabel
48
  1. Implementieren Sie die SerializableSchnittstelle, wenn Sie eine Instanz einer Klasse in eine Reihe von Bytes konvertieren möchten oder wenn Sie glauben, dass ein SerializableObjekt auf eine Instanz Ihrer Klasse verweisen könnte.

  2. Serializable Klassen sind nützlich, wenn Sie Instanzen von ihnen beibehalten oder über eine Leitung senden möchten.

  3. Instanzen von SerializableKlassen können leicht übertragen werden. Die Serialisierung hat jedoch einige Sicherheitsfolgen. Lesen Sie Joshua Blochs effektives Java .

Steve Emmerson
quelle
32

Die Antwort auf diese Frage ist vielleicht überraschenderweise nie oder realistischer nur dann, wenn Sie zur Interoperabilität mit Legacy-Code gezwungen sind . Dies ist die Empfehlung in Effective Java, 3. Ausgabe von Joshua Bloch:

Es gibt keinen Grund, die Java-Serialisierung in einem neuen System zu verwenden, das Sie schreiben

Laut Mark Reinhold, dem Chefarchitekten von Oracle, ist das Entfernen des aktuellen Java-Serialisierungsmechanismus ein langfristiges Ziel.


Warum die Java-Serialisierung fehlerhaft ist

Java bietet als Teil der Sprache ein Serialisierungsschema, für das Sie sich über die SerializableSchnittstelle entscheiden können. Dieses Schema weist jedoch mehrere unlösbare Mängel auf und sollte von den Java-Sprachdesignern als fehlgeschlagenes Experiment behandelt werden.

  • Grundsätzlich wird so getan, als könne man über die serialisierte Form eines Objekts sprechen . Es gibt jedoch unendlich viele Serialisierungsschemata, die zu unendlich vielen serialisierten Formen führen. Durch das Auferlegen eines Schemas, ohne das Schema zu ändern, können Anwendungen kein für sie am besten geeignetes Schema verwenden.
  • Es wird als zusätzliches Mittel zum Erstellen von Objekten implementiert, das alle Voraussetzungsprüfungen umgeht, die Ihre Konstruktoren oder Factory-Methoden durchführen. Sofern kein kniffliger, fehleranfälliger und schwer zu testender zusätzlicher Deserialisierungscode geschrieben ist, weist Ihr Code wahrscheinlich eine klaffende Sicherheitslücke auf.
  • Das Testen der Interoperabilität verschiedener Versionen des serialisierten Formulars ist sehr schwierig.
  • Der Umgang mit unveränderlichen Objekten ist mühsam.

Was ist stattdessen zu tun?

Verwenden Sie stattdessen ein Serialisierungsschema, das Sie explizit steuern können. B. Protokollpuffer, JSON, XML oder Ihr eigenes benutzerdefiniertes Schema.

Raedwald
quelle
2
Auf diesem Niveau kein großer Experte, aber Sie haben das Gefühl, einen Punkt zu haben.
Nachtwut
1
Ich denke es ist die beste Antwort!
Jjanczur