Frage

Ich bin derzeit an einem Projekt arbeiten, das jede Art von Objekt bestehen muss (von denen die Umsetzung haben wir keine Kontrolle), so könnten diese Objekte anschließend gestellt werden.

Wir können nicht ein ORM implementieren, da wir nicht die Nutzer unserer Bibliothek zur Entwicklungszeit beschränken kann.

Unsere erste Alternative mit der Java-Standard-Serialisierung zu serialisiert war, aber wir eine Menge Ärger hatten die Objekte erholen, wenn die Benutzer verschiedene Versionen des gleichen Objekts passieren gestartet (Attribute geändert Typen, Name, ...).

Wir haben mit der XMLEncoder Klasse versucht (verwandelt sich ein Objekt in ein XML), aber wir haben festgestellt, dass es einen Mangel an Funktionalität ist (nicht Aufzählungen zum Beispiel unterstützen).

Schließlich haben wir auch versucht, JAXB aber unsere Nutzer verhängen, um ihre Klassen mit Anmerkungen versehen.

Jede gute Alternative?

War es hilfreich?

Lösung

Die einfachste Sache für Sie zu tun, ist immer noch die Serialisierung zu verwenden, IMO, aber mehr in die serialisierte Form der Klassen gedacht setzen (was Sie wirklich sollte sowieso tun). Zum Beispiel:

  1. Explizit definieren die SerialUID.
  2. Definieren Sie eigene serialisierte Form gegebenenfalls.

Die serialisierte Form Teil der Klasse ist API- und sorgfältige Überlegungen sollten in die Gestaltung gesetzt werden.

Ich werde nicht in eine Menge von Details gehen, da so ziemlich alles, was ich gesagt habe, von Effective Java kommt. Ich werde stattdessen finden Sie es, insbesondere die Kapitel über Serialisierung. Es warnt Sie über alle Probleme in Sie laufen, und bietet die richtige Lösung für das Problem:

http://www.amazon.com/Effective-Java-2nd-Joshua- Bloch / dp / 0321356683


Mit dieser sagt, wenn Sie immer noch einen nicht-Serialisierung Ansatz unter Berücksichtigung sind, hier sind ein paar:

XML Rangier

Wie viele haben darauf hingewiesen, ist eine Option, aber ich glaube, Sie immer noch in die gleichen Probleme mit der Abwärtskompatibilität ausgeführt werden. Doch mit XML-Rangierung, werden Sie hoffentlich diese sofort fangen, da einige Rahmenbedingungen für Sie einige Prüfungen tun kann während der Initialisierung.

Die Umstellung auf / von YAML

Dies ist eine Idee, die ich mit liebäugelt worden, aber ich mochte das YAML-Format (zumindest als benutzerdefinierter toString () Format). Aber wirklich, denn du bist der einzige Unterschied ist, dass man anstelle von XML zu YAML wäre Rangier. Der einzige Vorteil ist, dass das YAML etwas menschlicher als XML lesbar ist. Die gleichen Einschränkungen gelten.

Andere Tipps

Es ist 2011, und in einem kommerziellen Grad REST Web-Services-Projekt verwenden wir die folgenden Serializer Kunden eine Vielzahl von Medientypen zu bieten:

  • XStream (für XML, aber nicht für JSON)
  • Jackson (für JSON)
  • Kryo (ein schnelles, kompaktes binäres Serialisierung-Format)
  • Lächeln (ein binäres Format, das mit Jackson kommt 1.6 und höher).
  • Java-Objekt-Serialisierung.

Wir experimentierten mit anderen Serializer kürzlich:

  • SimpleXML scheint solide, läuft mit 2x Geschwindigkeit von XStream, erfordert aber ein bisschen zu viel Konfiguration für unsere Situation.
  • YamlBeans hatten ein paar Bugs.
  • SnakeYAML hatte einen kleinen Fehler zu Daten beziehen.

Jackson JSON, Kryo und Jackson Lächeln war deutlich schneller als gute alte Java-Objekt-Serialisierung, um etwa 3x bis 4,5x. XStream ist auf der langsamen Seite. Aber diese sind alle festen Entscheidungen an dieser Stelle. Wir halten die anderen drei zu überwachen.

http://x-stream.github.io/ schön ist, nehmen Sie sich bitte schauen sie es! Sehr bequem

  

von dem mit der Umsetzung haben wir keine Kontrolle

Die Lösung ist tut dies nicht . Wenn Sie noch nicht die Kontrolle über eine Implementierung des Typs sollten Sie es nicht Serialisierung werden. Ende der Geschichte. Java Serialisierung bietet serialVersionUID speziell Serialisierung Inkompatibilitäten zwischen verschiedenen Versionen eines Typs für die Verwaltung. Wenn Sie nicht über die Umsetzung kontrollieren können Sie nicht sicher sein, dass IDs korrekt geändert werden, wenn ein Entwickler eine Klasse ändert.

Nehmen Sie ein einfaches Beispiel für einen ‚Punkt‘. Es kann entweder ein kartesische oder ein polares Koordinatensystem dargestellt werden. Es wäre zu kostspielig für Sie ein System zu bauen, die dynamisch mit dieser Art von Korrekturen bewältigen könnten - es hat wirklich der Entwickler der Klasse sein, der die Serialisierung-Design

.

Kurz gesagt, es ist Ihr Design, das ist falsch -. Nicht die Technologie

Google kam mit einem binären Protokoll up - http://code.google.com/apis/ Protocol Buffers / ist schneller, hat eine geringere Nutzlast im Vergleich zu XML -., die andere als alternative vorgeschlagen haben

Einer der advanteages von Protokollpuffer ist, dass es Informationen mit C austauschen kann, C ++, Python und Java.

Versuchen Sie die Serialisierung zu json mit Gson zum Beispiel.

Auch ein sehr schneller JDK-Serialisierung-Ersatz: http://ruedigermoeller.github.io/fast-serialization/

Wenn die Serialisierung Geschwindigkeit zu Ihnen wichtig ist, dann gibt es eine umfassende Benchmark von JVM Serializer hier:

Ich persönlich benutzen Ruhm viel, da sie Funktionen Interoperabilität mit Smalltalk (beide VW und Squeak) und Python. (Disclaimer: Ich bin der Hauptbeitrag des Fame-Projektes.)

Betwixt ist eine gute Bibliotheksobjekte für die Serialisierung - aber es ist nicht eine automatische Art sein würde die Sache. Wenn die Anzahl der Objekte, die Sie relativ festen zu serialisiert haben, so kann dies für Sie eine gute Option sein, aber wenn Sie Ihre ‚Kunden‘ neue Klassen werden soll werfen dich die ganze Zeit, kann es mehr Mühe, als es wert ist ( Auf jeden Fall einfacher als XMLEncoder für alle Sonderfälle, obwohl).

Ein weiterer Ansatz ist Ihre Kunden benötigen die entsprechenden .betwixt Dateien für alle Objekte zu schaffen, sie auf dich werfen (das effektiv entlastet, die Verantwortung zu ihnen).

Lange und kurze - Serialisierung ist hart - es gibt keine völlig hirntot Ansatz zu. Java Serialisierung ist so nah an einer hirntoten Lösung als ich je gesehen habe, aber wie Sie gefunden haben, eine falsche Verwendung der Version uid-Wert kann es brechen. Java Serialisierung Verwendung des Markers ‚Serializable‘ Schnittstelle erfordert auch, wenn Sie also nicht Ihre Quelle steuern können, sind Sie Art von Glück auf, dass ein.

Wenn die Anforderung wirklich so beschwerlich ist, wie Sie beschreiben, können Sie zu irgendeiner Art von BCE (Byte Code-Änderung) auf die Objekte / aspects / was auch immer zurückgreifen müssen. Dies ist immer Art und Weise außerhalb des Bereichs eines kleinen Entwicklungsprojekt, und in den Bereich der Hibernate, Casper oder einem ORM ....

Eine weitere Idee: Verwenden Sie Cache. Cache-Speicher bieten viel bessere Kontrolle, Skalierbarkeit und Robustheit der Anwendung. Noch muß, obwohl serialisiert, aber das Management wird viel einfacher, mit in einem Caching-Service-Framework. Cache im Speicher, Festplatte, Datenbank oder Array beibehalten werden - oder alle Optionen - mit einem Überlauf zu sein, stehen, Fail-Over für den anderen. Commons JCS und Ehcache sind zwei Java-Implementierungen, letztere ist eine Enterprise-Lösung zu 32 GB Speicherplatz freizugeben (Disclaimer: Ich habe nicht für ehcache arbeiten ;-)).

SBE ist eine etablierte Bibliothek für die schnelle, ByteBuffer basierte Serialisierung Bibliothek und in der Lage Versionierung. Allerdings ist es ein bisschen schwer zu verwenden, wie Sie Länge Wrapper-Klassen über sie schreiben müssen.

Im Lichte seiner Mängel, ich habe vor kurzem eine Java-only Bibliothek Serialisierung von SBE inspiriert und FIX-Protokoll (Common Finanzmarkt Protokoll Handel / quote zum Austausch von Nachrichten), die die Vorteile beide zu halten versucht, während der Überwindung ihres Schwächen. Sie können einen Blick auf https://github.com/iceberglet/anymsg

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top