2016-05-14 34 views
0

我試圖代碼在這裏(Java Serializable Object to Byte Array),也SerializationUtils.serialize(),但是當我序列化一個對象,我總是得到更多的字節,然後存儲在對象的字節數。Java:如何使用盡可能少的輸出字節將對象序列化爲字節數組?

例如,當我做SerializationUtils.serialize(新字節[1]),我可以得到與長度28輸出的字節數組而輸入對象具有1個字節。同樣,如果我有一個像

public class MyClass { 
    public byte[] a; 

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

A類和我創建一個對象

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

當我做SerializationUtils.serialize(OBJ),我會得到一個輸出字節數組大於1

更長

我真正在做我的計劃是,我要送兩方間的對象數組,所以我想先序列化這個對象數組到一個單一的字節數組,然後將其發送。但是SerializationUtils.serialize(MyClass [] obj)將會輸出一個數組,比字節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(MyClass的[] OBJ )甚至通過SerializationUtils.serialize(MyClass [] obj)將會產生比我擁有的msg更多的字節。

所以是有一些方法在Java中,我可以有效地序列對象的對象/陣列,並具有輸出字節數組是儘可能短?

在此先感謝。

回答

4

那麼Java中是否有某種方式可以高效地對對象/對象數組進行序列化並使輸出字節數組儘可能短?

當然。你需要做的是編寫你自己的定製的序列化代碼。例如,使用DataOutputStream類,你可以序列化byte[]這樣的:

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

,如果數據是可壓縮的,那麼你可能會做的更好。

對於用戶定義的類型,序列化代碼將更加複雜。但是如果你想「輸出字節數組是儘可能短」 ......然後這是你必須付出的價格!


之所以ObjectOututStream流是大的是,它是序列化/反序列化是類型安全的要求;即它可以檢測在序列化和反序列化之間表示類型已經改變的情況。這是通過在流中包含服務器UUID和類型描述符來完成的。這需要空間。

注意你(程序員)可以通過其他方式改善上的序列化對象的大小:

  • 通過聲明不必要的字段作爲transient
  • 通過編寫自定義readObject/writeObject。或
  • 聲明該類爲Externalizable,並實現空間高效的外化方法。

詳情請參考Java Object Serialization spec

相關問題