簡體   English   中英

與Java中的.txt文件相比,將集合讀/寫到.ser文件

[英]reading/writing a set to a .ser file compared to a .txt file in java

所以我有了這個Java程序,此刻它序列化了我的set對象並將其保存到.ser文件中

 FileOutputStream fileOut = new FileOutputStream("hash.ser");
          ObjectOutputStream out = new ObjectOutputStream(fileOut);
          out.writeObject(mySet);
          out.close();
          fileOut.close();
          System.out.printf("Serialized data is saved in hash.ser");

程序每次在程序啟動時也會從.ser文件讀取。 我只是很好奇,是否有人可以解釋兩種速度的差異,以及從txt文件與.ser文件進行讀取/加載之間的一般速度。 因為我不是100%肯定像我一樣讀/寫.ser文件實際上更快。 仔細研究了一下,真的找不到太多。 任何幫助將是巨大的,謝謝。

將Java序列化與“ txt”文件進行比較是不可能的,因為可以用許多不同的方式創建和讀​​取文本文件。 例如,您可以將XML或JSON或您自己的自定義文本格式寫入文本文件。 這些都有很大的不同,它們的性能和其他特征可能會有很大的不同。

Java序列化在許多情況下都可以很方便,但是也有很多限制和其他考慮因素會使事情變得非常復雜。

  • 要成功使用序列化,序列化的所有內容及其指向的所有內容都必須可序列化。 基本體,字符串和核心集合( ArrayListHashSet等)都可以序列化。 如果包含無法序列化的內容,則必須聲明它為transient並在反序列化時解決它的缺失,或者必須創建自定義序列化格式。 這增加了復雜性。
  • 序列化保留對象圖。 假設您的集合包含obj1obj2 ,它們每個都有對相同對象obj3的引用。 對該結構進行序列化和反序列化將保留此關系,因此之后obj1obj2都指向同一obj3實例。 其他序列化機制可能無法做到這一點,最終您會得到一些指向obj3副本的obj3
  • 序列化可能很脆弱。 除非在具有與序列化完全相同的類的系統上完成反序列化,否則您將獲得序列化兼容性異常。 防止這種情況的方法是在所有類中聲明serialVersionUID ,但是例如,如果添加或刪除了序列化的字段,則可能必須處理此類的演變。 同樣,這增加了復雜性。

至於性能,建議您嘗試一下,看看它的性能是否可以接受。 它可能比替代方案更快或更慢,但是您實際上必須實現這些替代方案並對其進行基准測試,並將結果與​​Java序列化進行比較。

我假設您正在問序列化和文件IO之間的區別,以將對象狀態寫入文件。

串行化的主要用途是像RMI中一樣通過網絡將對象狀態發送到另一個VM。 在生產代碼中很少使用序列化將對象狀態寫入文件。

如果使用文件IO將對象狀態寫入文件,則必須手動注意將所有字段(包括瞬態字段)寫入文件。

暫無
暫無

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

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