簡體   English   中英

Java:如何將對象序列化為字節數組,且輸出字節越少越好?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM