2009-04-04 22 views
5

Javaオブジェクトグラフをシリアル化する最適な方法は何ですか?効率的なJavaオブジェクトグラフのシリアル化

シリアライズライブラリーのための私の要件は 1です)、デシリアライゼーション 2の速さ)サイズ - できるだけ小さく(Javaのデフォルトの直列よりも小さい) 3)柔軟性 - 直列化する必要があるものの注釈ベースの定義がいいだろう。

基本ファイル形式は重要ではありません。

私はプロトコルバッファとXStreamを見ましたが、前者はマッピングファイルの必要性のため十分に柔軟ではなく、後で大きなファイルを生成します。

助けてください。

+0

JVMのシリアライザの比較(https://github.com/eishay/jvm-serializers/wiki)は便利なパフォーマンスのための情報などのサイズを結果を持っていますシリアライゼーション。 1つのユースケース(シリアライズされたオブジェクトの1つのタイプ)のみをカバーしますが、いくつかのアイデアがあります。 – StaxMan

答えて

1

ヘッセ行列は最も効率的です。

これは、外部化可能クラスを使用していても、Javaシリアライズよりも約2〜3倍小さく高速です。

どちらのシリアル化を使用しても、圧縮を簡単に使用してデータをよりコンパクトにすることができます。

これを超えると、独自のシリアル化を記述することができます。私は約2倍の高速でのByteBufferへ/からの書き込みシリアライザとヘッセの半分の大きさを書いた(約5倍高速化/ Javaのシリアライズよりも小さい)は、既存のシリアル化が必要なものを行います場合はほとんど利益のために、このかもしれあまりにも多くの努力。しかし、それはあなたが好きなようにカスタマイズ可能です;)

+0

シリアライザとは何ですか?どのオブジェクトでも動作しますか、各クラスにカスタムのシリアライズコードを記述する必要がありますか?循環オブジェクト参照は許可されていますか? –

+0

ヘッセ行列に非常に似ています。 Java以外のスレッド、ソケットなど、実際のリソースをモデリングするものを除いて、オブジェクトをシリアライズすることができます。カスタムシリアライズを書いていますが、スマートな圧縮を使用するので、カスタムシリアライザはテントが遅くなります。 –

+0

"循環オブジェクト参照は許可されていますか?" - これをサポートしていないオープンソースのバージョンをお持ちで、私は別のバージョンを作っています。 ;) –

0

私はデフォルトのJavaのシリアル化はかなり小さくなると思う。 transientキーワードでシリアル化したいものを有効に制限することはできませんか?それはあなたの3番目の問題(柔軟性と注釈)に対処するでしょう

+0

デフォルトのシリアル化は通常、個々のオブジェクトにとって巨大になります。これはすべてのクラスメタデータを含んでいるためです。同じ種類の複数のインスタンスを持つ大きなオブジェクトグラフの場合、これは問題になりません(1つのクラス定義のみ)が、単一オブジェクトの場合は残念ながら重要です。 – StaxMan

2

小さなオブジェクトの場合、Javaのシリアライズされたフォームは、シリアライズされたクラスの説明によって支配される可能性があります。

一般的に使用されているクラスのシリアル化されたデータを書き出し、一連のシリアル化されたストリームの共通プレフィックスとして使用できます。これは非常に壊れやすいことに注意してください。おそらく、クラスローダーインスタンスごとに再計算してチェックしたいと思うでしょう。

0

http://jserial.sourceforge.net/はあなたのニーズに合っていますか?

+0

ベンチマークの結果から、バブルの逆シリアル化は、Java 1.4.2のシリアライゼーションよりも遅い*と表示されます。 –

+0

ベンチマークのうちの2つでは、速度が遅く、速度が速いものもあります。それは何がシリアル化されているかによって異なります。とにかく1.4.2は古代ですので、自分のアプリケーションと環境でベンチマークして、それがあなたに合っているかどうかを確認する必要があります。 –

1

私は圧縮の有用性に関する注釈を2番目に挙げます。すべてのフォーマットがほぼ同じに圧縮されます。つまり、より大きな出力はより多く圧縮されます。

JSON with Jacksonは、XMLよりもはるかに高速で(PB、Hessianと競合している)、コンパクトでコンパクトです。 PBよりはるかに柔軟性があり、クライアント側のJSとの統合が容易で(問題がある場合)、トラブルシューティングが容易です。

+0

私はこれを二番目に(JSON/Jackson)!参照:http://spring-java-ee.blogspot.com/2010/12/how-to-dumpinspect-object-or-variable.html –

0

Databoardを使用して再帰的なシリアル化を行うことができます。

それは次のようになります。..

@Referable class Node { 
    public int id; 
    public Node[] reference; 
    public Node(int id, Node...reference) { 
     this.id = id; 
     this.reference = reference; 
    } 

} 

public static void main(String[] args) throws Exception { 

    Node a = new Node(0); 
    Node b = new Node(1); 
    Node c = new Node(2); 
    a.reference = new Node[] {b, c}; 
    b.reference = new Node[] {a}; 
    c.reference = new Node[] {c}; 

    Binding binding = Bindings.getBinding(Node.class); 
    Serializer s = binding.serializer(); 
    byte[] data = s.serialize(a); 

    Node d = (Node) s.deserialize(data); 
    System.out.println(binding.toString(d)); 
} 
関連する問題