簡體   English   中英

如何提高序列化類的輸出效率?

[英]how to make output of serialized class more efficient?

我正在序列化一個類(保存該類的內容),以便以后可以恢復它。 所以我使用ObjectOutputStream類實現了內置的序列化機制,但是輸出量很大。

但我想使輸出比內置序列化方法生成的輸出更有效或更小。 如何提高輸出效率?

我知道,

Java支持序列化,這是獲取對象並創建字節表示形式的功能,該功能可在以后用於恢復對象。 通過使用內部序列化機制,可以完成大多數用於序列化對象的設置。 Java將對象的屬性轉換為字節流,然后可以將其保存到文件或通過有線傳輸。

但我已經在這樣做了,我需要更有效的方法。 可能嗎?

我建議不要使用Java內置序列化。 您最好使用序列化庫,例如Jackson或您喜歡的任何其他庫。

現在,關於輸出大小,您可以通過用Java的GZIPOutputStream裝飾ObjectOutputStream來壓縮輸出:

OutputStream os = ...; // this is your ObjectOutputStream
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(os);

然后使用gzipOutputStream實例,就好像它是原始的ObjectOutputStream

請記住,還應該使用Java的GZIPInputStream來讀取序列化的數據:

InputStream is = ...; // this is your actual InputStream
GZIPInputStream gzipInputStream = new GZIPInputStream(is);

然后使用gzipInputStream實例,就像它是您的原始InputStream

如果類中有某些內容,您不需要保存到文件中,請使用java關鍵字:transient,它將不會被序列化。

例如, private transient Logger logger = Logger.getLogger();

您為什么不嘗試壓縮輸出文件。我發現了這篇文章: http : //www.devsum​​o.com/technotes/2014/03/java-compressed-serialization/

GZIPOutputStream用於壓縮輸出。

您可以使用自定義格式來序列化您的類。 在這種情況下,我將使用二進制格式來減小最終大小,避免使用XML和JSON等文本表示形式。

一個示例實現可能如下所示:

public class YourClass
{
  private int field1;
  private byte field2;
  // ...

  public void encode(DataOutput stream) throws IOException
  {
     stream.writeInt(field1);
     stream.writeByte(field2);
  }

  public static YourClass decode(DataInput stream) throws IOException
  {
    YourClass ret = new YourClass();
    ret.field1 = stream.readInt();
    ret.field2 = stream.readByte();
    return ret;
  }
}

encode方法用於將類寫入流, decode方法從該類讀取流。 decode方法是靜態的,因此它也可以創建類實例,而無需依賴用戶手動進行操作。

還要注意,如果您的類具有作為成員字段的類實例,並且您也想對其進行編碼,那么最好在所有可序列化或可序列化類的類中都包含encodedecode方法。

當然,這意味着要進行大量工作,因為所有領域都必須手工讀寫,但這可能是最節省空間的解決方案。

您可以使用JSONReaderJsonWriter並將對象轉換為JSON格式,並且可以將其存儲在某個地方以備將來使用。 在這種情況下,您的類無需實現可序列化的接口。 並且用於將json存儲在數據庫中所需的空間非常少。 變得輕巧

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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