[英]Java: how to serialize object into byte array with as few output bytes as possible?
我在這里嘗試了代碼(從Java Serializable Object to Byte Array )以及SerializationUtils.serialize(),但是當我序列化一個對象時,總是得到比存儲在該對象中的字節數更多的字節。
例如,當我執行SerializationUtils.serialize(new byte [1])時,我可以得到長度為28的輸出字節數組,而輸入對象只有1個字節。 同樣,如果我有一個像
public class MyClass {
public byte[] a;
public MyClass(byte[] a) {
this.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中,有什么方法可以有效地序列化對象/對象數組並使輸出字節數組盡可能短?
提前致謝。
那么,在Java中,有什么方法可以有效地序列化對象/對象數組並使輸出字節數組盡可能短?
當然。 您需要做的是編寫自己的自定義序列化代碼。 例如,使用DataOutputStream可以序列化byte[]
如下所示:
dos.writeInt(bytes.length);
dos.write(bytes, 0, bytes.length);
如果數據是可壓縮的,那么您可能會做得更好。
對於用戶定義的類型,序列化代碼將更加復雜。 但是,如果您希望“輸出字節數組盡可能短”…… 那就是您必須付出的代價 !
ObjectOututStream
流很大的原因是,序列化/反序列化必須是類型安全的; 也就是說,它可以檢測表示類型在序列化和反序列化之間已更改的情況。 這是通過在流中包含服務器UUID和類型描述符來完成的。 那需要空間。
請注意,您(程序員)可以通過其他方式改善序列化對象的大小:
transient
字段, readObject
/ writeObject
。 要么 Externalizable
並實現節省空間的外部化方法。 有關詳細信息,請參考Java Object Serialization規范 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.