与java中的.txt文件相比,将集合读/写到.ser文件

与java中的.txt文件相比,将集合读/写到.ser文件,java,performance,serialization,data-structures,set,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.c

所以我有了这个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文件。对此进行了一点调查,但在这方面确实找不到太多。任何帮助都会很好,谢谢。

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

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


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

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

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

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

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

除了RMI之外,序列化还有很多用途。你会感到惊讶;许多应用程序在不使用RMI的情况下序列化数据并将其存储到文件或数据库中。@StuartMarks当然,只要人的可读性不重要,这是存储状态的最简单方法。我想当数据变大时,它也比文本快得多。@Stuart Marks。我只举RMI为例。当然,除了通过网络发送对象状态外,序列化还必须有更多的用例。它不可能只用一个用例就进入java语言。