2016-05-14 8 views
0

私はここでコード(Java Serializable Object to Byte Array)とSerializationUtils.serialize()を試しましたが、オブジェクトをシリアル化すると、オブジェクトに格納されているバイト数よりもずっと多くのバイトが得られます。Java:できるだけ少ない出力バイトでオブジェクトをバイト配列にシリアル化する方法は?

例えば、SerializationUtils.serialize(新しいバイト[1])を実行すると、入力オブジェクトが1バイトの間に長さ28の出力バイト配列を取得できます。私は

public class MyClass { 
    public byte[] a; 

    public MyClass(byte[] a) { 
     this.a = a; 
    } 
} 

のようなクラスを持っている場合は同様に、私はオブジェクトを作成

MyClass obj = new MyClass(new byte[1]); 

私が行うとSerializationUtils.serialize(OBJ)、私ははるかに長い1

より出力バイト配列を取得します

私のプログラムで実際にやっていることは、2つのパーティ間でオブジェクトの配列を送信していることです。最初に、このオブジェクトの配列を1バイト配列にシリアル化してから送信します。しかし、SerializationUtils.serialize(MyClass [] obj)はobjが実際に格納するバイト数よりも多くのバイトを持つ配列を出力し、通信の帯域幅を増やします。

私はまた、メモリコピーを実行して、オブジェクトの配列から単一のバイト配列を自分で作成してみました:(MyClassの[] OBJ

MyClass[] obj = new MyClass[5]; 
for (int i=0; i<5; i++) 
    obj[i] = new MyClass(new byte[1]); 

byte[] msg = new byte[5]; 
for (int i=0; i<obj.length; i++) 
    System.arraycopy(obj[i].a, 0, msg, i, 1); 

しかし、これはSerializationUtils.serializeほど効率的ではないようです)でも、SerializationUtils.serialize(MyClass [] obj)によって、私が持っているmsgより多くのバイトが生成されます。

Javaにはいくつかの方法があります。オブジェクト/オブジェクトの配列を効率的にシリアル化し、出力バイト配列をできるだけ短くすることができますか?

ありがとうございます。

答えて

4

Javaにはいくつかの方法があります。オブジェクトのオブジェクト/配列を効率的にシリアル化し、出力バイト配列をできるだけ短くすることができますか?

確かに。あなたがする必要があるのは、カスタムシリアライゼーションコードを記述することです。

dos.writeInt(bytes.length); 
    dos.write(bytes, 0, bytes.length); 

を、データが圧縮可能だった場合、あなたは潜在的により良い行うことができます:たとえば、DataOutputStreamをを使用して、あなたがこのようなbyte[]をシリアル化できます。

ユーザー定義型の場合、シリアライズコードはより複雑になります。しかし、出力バイト配列をできるだけ短くしたい場合は、を支払う必要がある価格のを!!


ObjectOututStreamストリームが大きいことを理由は、シリアライズ/デシリアライズは、タイプセーフである必要であることです。すなわち、表現型が直列化と逆直列化との間で変化した場合を検出することができる。これは、サーバーのUUIDとタイプ記述子をストリームに組み込むことによって行われます。それはスペースが必要です。カスタムreadObject/writeObjectを書き込むことによってtransient

  • として不要なフィールドを宣言することによって

    • は、あなた(プログラマ)は、他の手段によってシリアライズされたオブジェクトのサイズに向上させることができます。または

    • のクラスを宣言し、スペース効率のよい外部化メソッドを実装することによって実現できます。

    詳細については、Java Object Serialization specを参照してください。

  • 関連する問題