[英]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.devsumo.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
方法是靜態的,因此它也可以創建類實例,而無需依賴用戶手動進行操作。
還要注意,如果您的類具有作為成員字段的類實例,並且您也想對其進行編碼,那么最好在所有可序列化或可序列化類的類中都包含encode
和decode
方法。
當然,這意味着要進行大量工作,因為所有領域都必須手工讀寫,但這可能是最節省空間的解決方案。
您可以使用JSONReader和JsonWriter並將對象轉換為JSON格式,並且可以將其存儲在某個地方以備將來使用。 在這種情況下,您的類無需實現可序列化的接口。 並且用於將json存儲在數據庫中所需的空間非常少。 變得輕巧
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.