【问题标题】:reading/writing a set to a .ser file compared to a .txt file in java与 java 中的 .txt 文件相比,将一组读/写到 .ser 文件
【发布时间】:2014-09-18 04:54:39
【问题描述】:

所以我有这个 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 performance serialization data-structures set


    【解决方案1】:

    无法将 Java 序列化与“txt”文件进行比较,因为可以通过多种不同方式创建和读​​取文本文件。例如,您可以将 XML、JSON 或您自己的自定义文本格式写入文本文件。这些都是完全不同的,并且它们的性能和其他特性可能会有很大差异。

    Java 序列化在许多情况下都很方便,但也有很多限制和其他考虑因素会使事情很快变得复杂。

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

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

    【讨论】:

      【解决方案2】:

      我假设您是在询问序列化和文件 IO 之间的区别,以便将对象状态写入文件。

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

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

      【讨论】:

      • 序列化除了RMI还有很多用途。你会感到惊讶;许多应用程序在不使用 RMI 的情况下序列化数据并将其存储到文件或数据库中。
      • @StuartMarks 当然,只要人类可读性无关紧要,这是存储状态的最简单方法。而且我想当数据变大时它也比文本快得多。
      • @Stuart Marks。我只举了 RMI 作为一个例子。当然,除了通过网络发送对象状态之外,还必须有更多的序列化用例。仅用一个用例是无法实现 Java 语言的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2013-03-25
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多