it-swarm.com.de

Java Serialisierung - Vor- und Nachteile, nutzen oder vermeiden?

Die Serialisierung wird für die Persistenz in Java verwendet. Es kann in Ordnung sein, einige Objekte mithilfe der Serialisierung beizubehalten. Für eine große Anzahl von Objekten sind ORM, Datenbank usw. jedoch möglicherweise besser. Es scheint, dass die Serialisierung nur für kleine Aufträge nützlich ist. Vielleicht irre ich mich. Sagen Sie mir also bitte, welche Vorteile die Serialisierung gegenüber Nicht-Serialisierungsmethoden hat. Wann sollte es verwendet werden und wann sollte es vermieden werden?

Diese Frage kam mir in den Sinn, nachdem ich den DZone-Artikel Is Object Serialization Evil? gesehen hatte

Und das sind die Zeilen, die meine Frage aufgeworfen haben:

Wenn Sie sich Java und seine Sitzungsobjekte ansehen, wird die reine Objektserialisierung verwendet. Angenommen, eine Anwendungssitzung ist relativ kurzlebig, dh höchstens einige Stunden, ist die Objektserialisierung einfach und wird gut unterstützt und in das Java -Konzept einer Sitzung integriert). Wenn die Datenpersistenz jedoch über einen längeren Zeitraum, möglicherweise Tage oder Wochen, andauert und Sie sich über neue Versionen der Anwendung Gedanken machen müssen, Serialisierung wird schnell böse. Wie jeder gute Java Entwickler weiß, wenn Sie ein Objekt auch in einer Sitzung serialisieren möchten, benötigen Sie eine echte Serialisierungs-ID (serialVersionUID), nicht nur eine 1L, und Sie müssen die serialisierbare Schnittstelle implementieren. Die meisten Entwickler kennen jedoch nicht die tatsächlichen Regeln hinter dem Java -Deserialisierungsprozess. Wenn sich Ihr Objekt geändert hat, müssen Sie dem Objekt nicht nur einfache Felder hinzufügen Es ist möglich, dass Java das Objekt nicht korrekt deserialisieren kann, selbst wenn sich die Serialisierungs-ID nicht geändert hat. Sie können Ihre Daten nicht mehr abrufen, was von Natur aus schlecht ist.

Mögen Entwickler, die dies lesen, sagen, dass sie niemals Code schreiben würden, der dieses Problem hätte. Das mag wahr sein, aber was ist mit einer Bibliothek, die Sie verwenden, oder einem anderen Entwickler, der nicht mehr in Ihrem Unternehmen beschäftigt ist? Können Sie garantieren, dass dieses Problem niemals auftritt? Die einzige Möglichkeit, dies zu gewährleisten, besteht darin, eine andere Serialisierungsmethode zu verwenden.

22
sky scraper

Serialisierung wird meistens in zwei Bereichen verwendet:

  • prototyping der Persistenz

    so gut wie jedes Objektdiagramm kann schnell serialisierbar gemacht werden. Für schnelle Proof-of-Concepts oder schnelle und schmutzige Anwendungen ist dies möglicherweise schneller als das Einrichten einer echten ORM-Schicht oder eines anderen Persistenzsystems

  • kurzzeitlagerung von nahezu beliebigen Objekten:

    Anwendungsserver neigen beispielsweise dazu, Sitzungsinformationen mithilfe der Serialisierung beizubehalten. Dies hat den Vorteil, dass die Werte in der Sitzung fast jeden Typ haben können (solange sie serialisierbar sind).

Für fast alle anderen Anwendungen sind die Nachteile, die Sie (und der Artikel) erwähnen, zu groß: Das genaue Format ist schwer stabil zu halten, Klassenänderungen können Ihre serialisierten Daten leicht unlesbar machen, das Lesen/Schreiben der Daten in Nicht-Java-Code ist fast unmöglich (oder zumindest viel schwieriger als nötig).

JAXB und ähnliche Technologien bieten ähnliche Funktionen zu ähnlich niedrigen Kosten und reduzieren gleichzeitig einige der Probleme.

15
Joachim Sauer

Ich verwende die Objektserialisierung, um eine Post-Mortem-Analyse für den Fall eines unerwarteten Produktionsfehlers zu ermöglichen. Die Eingaben für eine Berechnung werden in eine Datendatei serialisiert. Wenn ein Fehler gemeldet wird, kann ein einfaches Programm die Eingaben neu laden und die Berechnung mit einem angeschlossenen Debugger erneut ausführen. Oder eine groovige Shell kann verwendet werden, um die Objekte neu zu laden und sie bei Bedarf zu ändern.

Wir verwenden die Serialisierung auch, um Java Objekte über HTTP an einen Webdienst zu übergeben. Viel einfacher als die Serialisierung zu und von Text. Der Nachteil ist, dass die Client- und Serverinstallationen zusammen bereitgestellt werden müssen, dies ist jedoch nicht der Fall Problem, da wir beide Enden kontrollieren.

12
kevin cline

Was sind die Vorteile der Serialisierung gegenüber Nicht-Serialisierungsmethoden?

Die Java-Serialisierung hat einige Vorteile:

  • In das System integriert: Sie müssen sich nicht auf Tools, Bibliotheken oder Konfigurationen von Drittanbietern verlassen.

  • Relativ einfach zu verstehen, zumindest am Anfang.

  • Jeder Entwickler weiß es (oder sollte). Unabhängig davon, ob Java-Entwickler genehmigen oder ablehnen), sind sie wahrscheinlich mit der Serialisierung von Java -Objekten) vertraut.

Und natürlich gibt es Nachteile:

  • Circumvents standard Java flow. Ordnet Speicher zu, ruft jedoch keinen Konstruktor auf, sodass vorübergehende Felder nicht initialisiert werden. Felder werden in alphabetischer Reihenfolge und nicht in Quellreihenfolge initialisiert.

  • nicht so effizient räumlich, aber auch nicht schrecklich. Möglicherweise möchten Sie das Ergebnis komprimieren.

  • Spröde, wenn Sie keine Vorsichtsmaßnahmen treffen wenn sich Ihre Objekte ändern. Und selbst dann.

Wann sollte es verwendet werden und wann sollte es vermieden werden?

Verwenden Sie wann:

  • Die Größe der Bereitstellung ist wichtig. Eingebaut in das System, also 0 zusätzliche Bytes.

  • Alle Schauspieler verwenden kompatible Versionen.

  • Langzeitlagerung ist kein Problem.

Vermeiden Sie wann:

  • Die oben genannten Punkte gelten nicht.
8
JvR

Serialisierung und ein ORM/eine Datenbank sind verschiedene Dinge, obwohl es einige Überschneidungen gibt.

Ein serialisiertes Objekt repräsentiert alle Informationen, die zum "Auftauen" eines persistierten Objekts und zum erneuten Auffüllen seiner Daten erforderlich sind. Ein ORM und eine Datenbank speichern Daten in einer Datenbank. Eine Klasse kann Informationsfelder enthalten, die vom ORM nicht in der Datenbank gespeichert werden, z. B. ein berechnetes Feld.

Darüber hinaus lösen Serialisierung und ein ORM verschiedene Probleme. Die Serialisierung löst das Problem, dass ein Objektdiagramm in einem Stream (Speicher, Dateisystem usw.) beibehalten wird. Ein ORM verwaltet die Zuordnung von Informationen zu Datenbankspalten sowie das Abrufen und Instanziieren von Objekten und bietet außerdem nützliche Funktionen wie Suchen und verzögertes Laden.

Verwenden Sie ein ORM, wenn Sie Daten in einer Datenbank speichern möchten, wenn Sie mit großen Datenmengen arbeiten oder Berichte, Suchen/Abfragen, Warehousing oder andere Dinge benötigen, in denen Datenbanken gut sind. Verwenden Sie die Serialisierung, wenn Sie eine Darstellung Ihrer Datenstruktur (en) auf der Disc speichern möchten.

3
Sam

Kurze Antwort auf "wann Java Serialisierung zu verwenden ist" und "wann zu vermeiden Java Serialisierung")

Verwenden Sie Java Serialisierung, wenn

  • es sollten nur wenige Codierungen erforderlich sein
  • es spielt keine Rolle, dass Binärdaten nicht für Menschen lesbar sind
  • das Suchen in serialisierten Daten ist nicht erforderlich (eine datenbankähnliche Abfrage ist nicht möglich).
  • entweder
    • serialisierte Datenstruktur ändert sich nicht oder
    • es spielt keine Rolle, ob gespeicherte serialisierte Daten nach einer "Datenstrukturänderung" nicht mehr lesbar sind (d. h. Sitzungsdaten in einer Web-App).

In allen anderen Situationen ist "Binär Java Serialisierung" schlecht)

Alternativen

  • xML-Serialisierung
  • nosql Datenbank
  • relationale Datenbank mit ORM
0
k3b

Serialisierung wird in der Praxis selten eingesetzt.

Wie bereits erwähnt, besteht der häufigste Anwendungsfall für die Serialisierung darin, Objekte als Blobs in einer Sitzungsdatenbank zu speichern. Dies funktioniert aus zwei Gründen gut: Sitzungen sind in der Regel von kurzer Dauer, und in der Sitzungsdatenbank gibt es keine Kenntnisse darüber, wie beliebige Objekte einem relationalen Modell zugeordnet werden können.

Für Daten, die über einen längeren Zeitraum aufbewahrt werden müssen (wie ein Amazon-Einkaufswagen), empfiehlt es sich, diese Daten in einer Datenbank zu speichern.

Der Sitzungspersistenzmechanismus stellt sicher, dass ein Benutzer mit einer aktiven Sitzung an denselben Server zurückgegeben wird. Auf die Sitzungsdatenbank wird nur zugegriffen, wenn ein Server ausfällt und der Benutzer auf einen neuen Server umgeleitet wird. Der neue Server erkennt eine aktive Sitzung, findet sie jedoch nicht im Speicher. Daher versucht er, sie aus der Sitzungsdatenbank abzurufen, um dem Benutzer eine nahtlose Benutzererfahrung zu bieten.

Bei diesem Ansatz gibt es zwei Probleme:

Erstens ist das Leeren von Sitzungsdaten in die Sitzungsdatenbank ein langsamer Prozess. Das zu häufige Löschen von Sitzungsdaten beeinträchtigt die Leistung, und die meisten Server sind so konfiguriert, dass sie alle 30 Sekunden, jede Minute oder länger geleert werden. Diese "scheinbar" Failover-Lösung ist niemals 100% effektiv.

Zweitens sind die meisten Clients meiner Erfahrung nach damit einverstanden, dass eine Fehlermeldung angezeigt wird, in der der Benutzer aufgefordert wird, sich anzumelden und es in den seltenen Fällen, in denen ein Server ausfällt, erneut zu versuchen. In diesem Fall schalten wir die Sitzungsdatenbank vollständig aus und genießen die Leistungssteigerung.

Eine andere Verwendung der Serialisierung besteht darin, schnellere Antwortzeiten bereitzustellen, indem Frameworks wie Flex verwendet werden, die die Serialisierung und Komprimierung von Objektgraphen für Server-Client-Interaktionen verwenden.

Wie andere bereits betont haben, gibt es einige kreative und nützliche Gründe für die Verwendung der Serialisierung, die jedoch in der Praxis selten sind.

In der Vergangenheit ist es schwierig, Serialisierung korrekt und zuverlässig zu implementieren, was ihre Verwendung auf eine kleine Anzahl von Fällen beschränkt. Die meisten Entwickler werden Objekte niemals selbst serialisieren, sondern können sich auf Frameworks verlassen, die dies hinter den Kulissen tun.

0
eric w