当前位置: 首页 > 知识库问答 >
问题:

如何在文件中写入非序列化对象(如形状),以便以后可以读取它们

申屠宏胜
2023-03-14

我有一个程序,其类类似于下面的基本示例:

public class Vertex extends Circle implements Serializable {
    private int vertexID;
    private final static double SIZE = 10.0;

    // Constructor
    public Vertex(int ID, double x, double y) {
        super(x, y, SIZE, Color.BLUE);
        this.vertexID = ID;
    }
}

我希望能够做的是写一个列表

FileChooser fc = new FileChooser();
File fileChosen = fc.showOpenDialog(window);

try {               
   FileOutputStream fOutStream = new FileOutputStream(fileChosen);
   ObjectOutputStream oOutStream = new ObjectOutputStream(fOutStream);

   oOutStream.writeObject(myVertices);
   oOutStream.close();
} catch {
    // Exception handling here
}

上述实现的问题在于,尽管 Vertex 实现了 Serializable,但超类 Circle 及其超类 Shape 并未实现 Serializable结果是文件包含顶点对象,但所有形状细节都将丢失,默认为 0。

这类问题有简单的解决方案吗?我目前唯一的选择似乎是创建我自己的形状/Circle,将位置/显示数据存储为双精度,这样它就可以<code>串行化Shape对象。我想,我必须要么构造实际的Shape对象来显示它们。

谢谢你!

共有2个答案

马阳曦
2023-03-14

如果有人想查看 Shape 的实际代码,特别是 Circle 对象,这是我根据公认的答案实现的。还包括一个列表示例

private void writeObject(ObjectOutputStream oos) throws IOException {
    oos.writeInt(vertexID);
    oos.writeObject(myVertices);
    oos.writeDouble(super.getCenterX());
    oos.writeDouble(super.getCenterY());
}

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
    // Read in same order as write
    this.vertexID = ois.readInt();
    this.myVertices = (List<Vertex>) ois.readObject();
    super.setCenterX(ois.readDouble());
    super.setCenterY(ois.readDouble());

    // Default Circle properties
    super.setRadius(SIZE); // Default
    super.setFill(Color.BLUE); // Default
}

汝承载
2023-03-14

您需要创建一个 writeObject/readObject 方法来保存所需的其他状态。

序列化-readObject写对象覆盖

readObject/writeObject 在序列化中的使用

为什么 readObject 和 writeObject 是私有的,为什么我要显式写入瞬态变量

Java 自定义序列化

Java:writeObject vs writeExternal 的效率

 类似资料:
  • 问题内容: 我将多个对象写入文件,然后在代码的另一部分中检索它们。我的代码没有错误,但是无法正常工作。您能帮我发现我的代码有什么问题吗?我从不同的网站阅读了不同的代码,但是没有一个对我有用! 这是将对象写入文件的代码:MyClassList是一个数组列表,其中包含我的类的对象(必须将其写入文件)。 我向输出流的构造函数添加了“ true”,因为我想将每个对象都添加到文件的末尾。那是对的吗? 这是我

  • 我必须将对象(播放器)保存到文件列表中,然后当我再次打开程序时,我必须与播放器一起读取该文件并将其添加到列表中。但是我读这个文件有问题吗?我做错了什么? ///////////////////////////// }

  • 我们目前正在开发云数据流上的概念验证Apache Beam管道。我们将一些文件(没有文本;自定义二进制格式)放入Google Cloud Buckets,并希望将这些文件作为byte[]读取,并在流中反序列化它们。但是,我们找不到能够读取非文本文件的波束源。唯一的想法是扩展类,但我们认为应该有一个更简单的解决方案,因为这听起来是一个非常简单的任务。 谢谢你们的帮助。

  • 问题内容: 我试图用来从属性文件中检索。文档中对此方法的描述为: 从此资源包或其父级中获取给定键的字符串数组。 但是,我尝试将值作为多个单独的键/值对存储在属性文件中: 并以逗号分隔列表: 但是使用都无法检索到这些。 如何在属性文件中表示一组键/值对,以便可以使用检索它们? 问题答案: 一个对象可以容纳 s ,而不仅仅是s。往往会忘记这一点,因为它们绝大多数用于加载.properties文件,因此

  • 如何在JavaFX中组合形状(例如圆形)以拖动它们?示例代码基于 Oracle 教程。每个圆圈都可以移动。我想在拖动蓝色圆圈时单独移动它。我想在单击并拖动绿色圆圈时移动绿色和蓝色圆圈,并在单击并拖动红色圆圈时移动所有三个圆圈。有什么想法吗?

  • 在我的php脚本中,我有一个简单的username/email exists条件,但是我想把这个错误(如果存在的话)放在html的某个地方,这样我就可以设置它的样式并将它放置在我的表单上。Echo只是把它放在左上角。我该怎么做?设置变量似乎不是最佳解决方案。