与java中的.txt文件相比,将一个集读取/写入.ser文件

时间:2014-09-17 02:31:14

标签: java performance serialization data-structures set

所以我有这个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文件。看了一下,真的找不到这个。任何帮助都会很棒,谢谢。

2 个答案:

答案 0 :(得分:1)

将Java序列化与" txt"进行比较是不可能的。文件,因为可以以任何数量的不同方式创建和读​​取文本文件。例如,您可以将XML或JSON或您自己的自定义文本格式写入文本文件。这些都是完全不同的,并且可能在性能和其他特征方面有很大差异。

Java序列化在很多情况下都很方便,但是还有很多限制和其他注意事项可以使事情很快变得复杂。

  • 要成功使用序列化,您序列化的所有内容及其指向的所有内容都必须是可序列化的。基元,字符串和核心集合(ArrayListHashSet等)都是可序列化的。如果您包含不可序列化的内容,则必须声明它transient并在反序列化时处理它的缺失,或者您必须创建自定义序列化格式。这增加了复杂性。
  • 序列化保留对象图。假设您的集合包含obj1obj2,每个集合都引用了同一个对象obj3。序列化和反序列化此结构将保留此关系,因此obj1obj2之后将指向相同的obj3实例。其他序列化机制可能不会这样做,并且您最终会得到一些指向obj3副本的对象。
  • 序列化可能很脆弱。除非在具有与用于序列化的完全相同的类的系统上进行反序列化,否则您将获得序列化兼容性异常。防止这种情况的方法是在所有类中声明serialVersionUID,但是您可能必须处理此类的演变,例如,如果添加或删除序列化字段。同样,这增加了复杂性。

至于表现,我建议您尝试一下,看看它是否表现得令人满意。它可能比替代方案更快或更慢,但您真的必须实现这些替代方案并对其进行基准测试,并将结果与​​Java序列化进行比较。

答案 1 :(得分:0)

我假设您要求序列化和文件IO之间的区别是将对象状态写入文件。

Serialization的主要用途是通过网络将对象状态发送到另一个VM,就像在RMI中一样。 使用序列化将对象状态写入文件很少在生产代码中使用。

如果使用文件IO将对象状态写入文件,则必须手动将所有字段写入文件,包括瞬态字段。