Javaシリアライゼーションの最良の選択肢はどれですか?

java serialization xml-serialization

私は現在、これらのオブジェクトが後で回復できるように、どんな種類のオブジェクト(どの実装でも制御できません)を保持する必要があるプロジェクトに取り組んでいます。

開発時にライブラリのユーザーを制限することはできないため、ORMを実装することはできません。

私たちの最初の代替案はJavaのデフォルトのシリアライゼーションでそれをシリアライズすることでしたが、ユーザーが同じオブジェクトの異なるバージョンを渡し始めたときにオブジェクトを回復するのに多くの問題がありました。

XMLEncoderクラスを試しました(オブジェクトをXMLに変換します)が、機能が不足していることがわかりました(例えばEnumはサポートしていません)。

最後に、私たちもJAXBを試しましたが、これは私達のユーザーに彼らのクラスに注釈を付けるように強います。

代替案はありますか?

  43  23


ベストアンサー

2011年のことで、商用グレードのREST Webサービスプロジェクトでは、次のシリアライザを使用してクライアントにさまざまなメディアタイプを提供しています。

  • XStream(XML用、JSON用ではない)

  • Jackson(JSON用)

  • Kryo(高速でコンパクトなバイナリシリアル化形式)

  • Smile(Jackson 1.6以降に付属するバイナリ形式)。

  • Javaオブジェクト直列化

最近他のシリアライザを試しました。

  • SimpleXMLはしっかりしているようで、XStreamの2倍の速度で動作しますが、私たちの状況では少し多すぎる設定が必要です。

  • YamlBeansにいくつかのバグがありました。

  • SnakeYAMLに日付に関する軽微なバグがありました。

Jackson JSON、Kryo、およびJackson Smileはすべて、古き良きJava Object Serializationよりも約3倍から4.5倍速くなりました。 XStreamは遅い面にあります。 しかし、これらはすべて現時点では確かな選択です。 他の3つを監視し続けます。

36


19


_
_どの制御もありません

__

解決策はこれをしないことです。 型の実装を制御できない場合は、直列化しないでください。 物語の終わり。 Javaシリアライゼーションは、型の異なるバージョン間のシリアライゼーションの非互換性を管理するために特にserialVersionUIDを提供します。 実装を制御しないと、開発者がクラスを変更したときにIDが正しく変更されているかどうかを確認できません。

‘ポイント’の簡単な例を見てください。 それはデカルト座標系または極座標系のいずれかで表すことができます。 この種の修正に動的に対処できるシステムを構築するのは、法外なコストになるでしょう – それは、シリアライゼーションを設計するクラスの開発者でなければなりません。

一言で言えば、あなたのデザインは間違っています – テクノロジーではありません。

14


最も簡単なことは、まだシリアライゼーション、IMOを使用することですが、クラスのシリアライズされた形式にもっと注意を払うことです(とにかくやるべきです)。 例えば:

  1. SerialUIDを明示的に定義します。

  2. 必要に応じて独自の直列化形式を定義してください。

直列化された形式はクラスのAPIの一部であり、慎重に考慮して設計する必要があります。

私が言ったことのほとんどすべてがEffective Javaから来ているので、私は多くの詳細に入ることはしません。 代わりに、それを参照します。特に、直列化に関する章です。 それはあなたが遭遇しているすべての問題についてあなたに警告して、そして問題への適切な解決策を提供します:

” ” ‘

とはいえ、それでも非シリアル化アプローチを検討しているのであれば、ここにいくつかあります。

  • XMLマーシャリング*

多くの人が指摘しているようにオプションですが、後方互換性についても同じ問題に遭遇するでしょう。 ただし、XMLマーシャリングを使用すると、初期化中にいくつかのフレームワークでチェックが行われる可能性があるため、これらをすぐに検出できます。

  • YAMLとの間の変換*

これは私がもてなしてきたアイデアですが、私は本当に(少なくともカスタムのtoString()フォーマットとして)YAMLフォーマットが好きでした。 しかし実際には、唯一の違いは、XMLではなくYAMLにマーシャリングすることです。 唯一の利点は、YAMLがXMLよりもわずかに人間が読みやすいということです。 同じ制限が適用されます。

9


グーグルはバイナリプロトコルを思いついた – http://code.google.com/apis/protocolbuffers/はより速く、XMLと比較してより小さなペイロードを持っている – 他の人が代替として提案している。

プロトコルバッファの利点の1つは、C、C、python、およびjavaと情報を交換できることです。

9


たとえば Gsonを使用してjsonにシリアル化してみてください。

5


また、非常に高速なJDKシリアライゼーションドロップイン代替品:http://ruedigermoeller.github.io/fast-serialization/

5


シリアル化の速度が重要な場合は、ここにJVMシリアライザの総合的なベンチマークがあります。

3


おそらく キャスト

1


個人的には、Smalltalk(VWとSqueakの両方)とPythonとの相互運用性を特徴としているので、私は Fameをよく使います。 (免責事項、私は名声プロジェクトの主な寄稿者です。)

1


タイトルとURLをコピーしました