it-swarm.dev

Co je nejlepší alternativou pro Java Serialization?

V současné době pracuji na projektu, který musí vydržet jakýkoliv druh objektu (jehož implementace nemáme žádnou kontrolu), aby tyto objekty mohly být následně obnoveny. 

Nemůžeme implementovat ORM, protože nemůžeme omezit uživatele naší knihovny v době vývoje.

Naší první alternativou bylo serializovat ji s výchozím serializací Java, ale měli jsme spoustu problémů při obnově objektů, když uživatelé začali předávat různé verze stejného objektu (atributy, typy, názvy ...).

Zkoušeli jsme s třídou XMLEncoder (transformuje objekt do XML), ale zjistili jsme, že je nedostatek funkčnosti (například nepodporuje Enums). 

Nakonec jsme také vyzkoušeli JAXB, ale to nutí naše uživatele, aby anotovali své třídy.

Nějaká dobrá alternativa?

43
Alotor

Nejjednodušší věc, kterou musíte udělat, je stále používat serializaci, IMO, ale více přemýšlet o serializované formě tříd (které byste stejně měli dělat). Například:

  1. Explicitně definujte SerialUID.
  2. V případě potřeby definujte vlastní serializovaný formulář.

Serializovaná forma je součástí API třídy a do jejího designu by mělo být vloženo pečlivé uvážení.

Nebudu chodit do mnoha detailů, protože skoro všechno, co jsem řekl, pochází z Efektivní Javy. Místo toho vás odkázám, konkrétně kapitoly o serializaci. Upozorňuje vás na všechny problémy, na které narazíte, a poskytuje vhodná řešení problému:

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


S tím bylo řečeno, že pokud stále zvažujete přístup, který není serializační, zde je pár:

XML marshalling

Jak mnozí zdůraznili, je to možnost, ale myslím si, že budete mít stále stejné problémy se zpětnou kompatibilitou. Nicméně, s XML zařazování, budete snad chytit tyto hned, protože některé rámce mohou udělat nějaké kontroly pro vás během inicializace.

Převod na/z YAML

To je nápad, se kterým jsem si pohrával, ale ve skutečnosti se mi líbil formát YAML (alespoň jako vlastní formát toString ()). Ale opravdu, jediný rozdíl pro vás je, že byste se místo XML přidali k YAML. Jedinou výhodou je, že YAML je o něco více lidsky čitelný než XML. Platí stejná omezení.

9
Jack Leow

Je to rok 2011 a v komerčním projektu REST webových služeb používáme následující serializátory, které klientům nabízejí různé typy médií:

  • XStream (pro XML, ale ne pro JSON)
  • Jackson (pro JSON)
  • Kryo (rychlý, kompaktní binární serializační formát)
  • Smile (binární formát, který přichází s Jacksonem 1.6 a novějším).
  • Serializace Java objektů.

Nedávno jsme experimentovali s jinými serializátory:

  • SimpleXML se zdá být solidní, běží 2x rychleji než XStream, ale vyžaduje trochu víc konfigurace pro naši situaci.
  • YamlBeans měl pár chyb.
  • SnakeYAML měl menší chybu týkající se dat.

Jackson JSON, Kryo a Jackson Smile byli všichni výrazně rychlejší než stará stará Java Object Serialization, asi 3x až 4,5x. XStream je na pomalé straně. To jsou však v tomto okamžiku všechny pevné volby. Ostatní tři budeme sledovat.

36
Jim Ferrans

http://x-stream.github.io/ je Nice, prosím, podívejte se na to! Velmi pohodlné

19
krosenvold

ze které implementace nemáme žádnou kontrolu

Řešení je nedělejte to . Nemáte-li kontrolu nad implementací typu, neměli byste ho sériozovat. Konec příběhu. Java serializace poskytuje serialVersionUID speciálně pro správu nekompatibility serializací mezi různými verzemi typu. Pokud implementaci neovládáte, nemůžete si být jisti, že se ID při změně třídy změní správně.

Vezměte jednoduchý příklad „bodu“. Může být reprezentován buď kartézským nebo polárním souřadným systémem. Bylo by pro vás nákladné, kdybyste vytvořili systém, který by se mohl dynamicky vyrovnávat s těmito druhy oprav - skutečně to musí být vývojář třídy, který navrhuje serializaci.

Stručně řečeno, váš návrh je špatný - ne technologie.

14
johnstok

google přišel s binárním protokolem - http://code.google.com/apis/protocolbuffers/ je rychlejší, má menší užitečné zatížení ve srovnání s XML - které ostatní navrhli jako alternativní.

Jednou z výhod protokolových vyrovnávacích pamětí je, že si může vyměňovat informace s C, C++, pythonem a Java. 

9
anjanb

Také velmi rychlá náhrada JDK serializace: http://ruedigermoeller.github.io/fast-serialization/

5
R.Moeller

Zkuste serializovat na json pomocí například Gson .

5
Benno Richters

Pokud je pro vás důležitá serializační rychlost, je zde komplexní měřítko serializátorů JVM zde:

3
Andrejs

Osobně používám Fame hodně, protože to představuje interoperabilitu s Smalltalk (oba VW a Squeak) a Python. (Zřeknutí se odpovědnosti, jsem hlavním přispěvatelem projektu Fame.)

1
akuhn

Betwixt je dobrá knihovna pro serializaci objektů - ale to nebude automatický druh věci. Pokud je počet objektů, které musíte serializovat, relativně pevný, může to být dobrá volba pro vás, ale pokud váš zákazník bude po celou dobu házet nové třídy, může to být více úsilí, než stojí za to. Pro všechny speciální případy je však rozhodně jednodušší než XMLEncoder.

Dalším přístupem je požadovat, aby váš zákazník poskytl příslušné soubory .betwixt pro všechny objekty, které na vás hodí (což jim účinně přenese odpovědnost).

Dlouhá a krátká - serializace je tvrdá - není k ní žádný mozek mrtvý přístup. Java serializace je tak blízko řešení mozku, jak jsem kdy viděl, ale jak jste zjistili, nesprávné použití hodnoty verze uid jej může porušit. Java serializace také vyžaduje použití značky 'Serializable' rozhraní, takže pokud nemůžete ovládat svůj zdroj, jste na tomhle tak trochu smůlu.

Pokud je požadavek skutečně tak náročný, jak popisujete, budete se muset uchylovat k nějakému druhu BCE (modifikace Byte kódu) na objektech/aspektech/cokoliv. To je cesta mimo oblast malého rozvojového projektu a do oblasti Hibernate, Casper nebo ORM.

1
Kevin Day

Možná Castor ?

1
toolkit

Další nápad: Použít mezipaměť. Caches poskytují mnohem lepší kontrolu, škálovatelnost a robustnost aplikace. Přesto je třeba serializovat, ale správa se stává mnohem jednodušší v rámci služby ukládání do mezipaměti. Mezipaměť může být zachována v paměti, na disku, v databázi nebo v poli - nebo na všech volbách - s jedním přeplněným, stojanem, neúspěchem pro druhého. Commons JCS a Ehcache jsou dvě implementace Java, druhá je podnikové řešení do 32 GB úložného prostoru (disclaimer: nefunguje pro ehcache ;-)). 

0
Net Dawg