Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用序列化将对象保存到文件_Java_Serialization_Collections - Fatal编程技术网

在Java中使用序列化将对象保存到文件

在Java中使用序列化将对象保存到文件,java,serialization,collections,Java,Serialization,Collections,我在集合中存储了大量数据 我想将此数据保存到一个文件中。使用序列化是个好主意吗? 或者我应该使用自定义格式保存数据,或者将其保存为XML格式(例如? (集合中的元素是自定义类。是否需要实现序列化对象的方法?您可以同时使用这两种方法。我更愿意将它们保存为XML,因为XML文件中不太可能有数据损坏。 但如果您想使用序列化将自定义类保存到数据文件中,则需要在这些自定义类中实现可序列化接口。您可以使用这两种方法。我更愿意将它们保存为XML,因为XML文件中不太可能有数据损坏。 但是,如果要使用序列化将自

我在
集合中存储了大量数据

我想将此数据保存到一个文件中。使用序列化是个好主意吗?
或者我应该使用自定义格式保存数据,或者将其保存为XML格式(例如?

(集合
中的元素是自定义类。是否需要实现序列化对象的方法?

您可以同时使用这两种方法。我更愿意将它们保存为XML,因为XML文件中不太可能有数据损坏。
但如果您想使用序列化将自定义类保存到数据文件中,则需要在这些自定义类中实现可序列化接口。

您可以使用这两种方法。我更愿意将它们保存为XML,因为XML文件中不太可能有数据损坏。
但是,如果要使用序列化将自定义类保存到数据文件中,则需要在这些自定义类中实现可序列化接口。

是否需要实现序列化对象的方法

为了序列化对象,如果在序列化和反序列化过程中需要“特殊”处理,则应实现可序列化接口提供以下方法的实现

- private void writeObject(ObjectOutputStream out) throws IOException;
- private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

您可以在oracle站点上找到有关序列化的更多详细信息。您可以访问以开始。

是否需要实现序列化对象的方法

为了序列化对象,如果在序列化和反序列化过程中需要“特殊”处理,则应实现可序列化接口提供以下方法的实现

- private void writeObject(ObjectOutputStream out) throws IOException;
- private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

您可以在oracle站点上找到有关序列化的更多详细信息。您可以访问开始。

我不会将序列化类写入磁盘。一旦JVM或任何库发生更改,它可能就没用了。这意味着在一个系统上创建的文件可能无法在另一个系统上工作


相反,我将编写数据的文本版本。如果您的集合包括其他集合或类,我会使用XML,因为它可以很好地处理嵌套。如果数据很简单,我可能只写一个逗号sep文件,头行包括版本号和数据集的描述,一行告诉列名、数据行和EOF行。

我不会将序列化类写入磁盘。一旦JVM或任何库发生更改,它可能就没用了。这意味着在一个系统上创建的文件可能无法在另一个系统上工作


相反,我将编写数据的文本版本。如果您的集合包括其他集合或类,我会使用XML,因为它可以很好地处理嵌套。如果数据很简单,我可能只写一个逗号sep文件,其中的标题行包括版本号和数据集的描述,一行告诉列名、数据行和EOF行。

可序列化类不能保证在下一个Java版本或micro版本中可以反序列化。因此,XMLEncoder和XMLDecoder是存储和检索数据的更健壮的方法。要使用基于XML的类,感兴趣的对象将需要一个类似bean的表单。为什么使用序列化会更容易导致数据损坏??事实上,XML将文本限制为字符的子集,除非您使用base64编码或类似编码。@Andrew Thompson您正在考虑Swing。AWT中的序列化没有经过深思熟虑
XMLEncoder
XMLDecoder
是一种黑客(查看源代码,查看所有处理其他包中标准类的黑客)。@Tom Hawtin。我从来没有提到过数据损坏。我的理解是,数据可能会根据不同的JVM以不同的形式序列化。关于AWT/Swing的所有讨论是如何进入其中的?“我指的是波乔。”安德鲁·汤普森我最初的评论是指答案。据我所知,AWT/Swing是Java库中唯一一个串行兼容性未标准化的地方。然而,
serialVersionUID
的计算在不同的编译器之间可能会有不同的结果(不幸的是,自动生成规范包括合成方法),因此建议和警告是明确的。可序列化类不保证在下一个Java版本或微版本中可以反序列化。因此,XMLEncoder和XMLDecoder是存储和检索数据的更健壮的方法。要使用基于XML的类,感兴趣的对象将需要一个类似bean的表单。为什么使用序列化会更容易导致数据损坏??事实上,XML将文本限制为字符的子集,除非您使用base64编码或类似编码。@Andrew Thompson您正在考虑Swing。AWT中的序列化没有经过深思熟虑
XMLEncoder
XMLDecoder
是一种黑客(查看源代码,查看所有处理其他包中标准类的黑客)。@Tom Hawtin。我从来没有提到过数据损坏。我的理解是,数据可能会根据不同的JVM以不同的形式序列化。关于AWT/Swing的所有讨论是如何进入其中的?“我指的是波乔。”安德鲁·汤普森我最初的评论是指答案。据我所知,AWT/Swing是Java库中唯一一个串行兼容性未标准化的地方。然而,
serialVersionUID
的计算在不同的编译器之间可能会有不同的结果(不幸的是,自动生成的规范包括合成方法),因此建议和警告是明确的。“这意味着在一个系统上创建的文件可能无法在另一个系统上工作!”什么?没错。序列化(不是XML或您已经序列化的内容)依赖于每个系统上的各个jar版本。假设您序列化一个包含int的类,然后在该类具有两个int的系统上对其进行反序列化-会发生什么情况?几年前我在使用R时遇到了这个问题