gpt4 book ai didi

java - 涉及多个类的序列化

转载 作者:行者123 更新时间:2023-11-30 06:40:02 25 4
gpt4 key购买 nike

你能帮我理解如何实现序列化吗?我已经阅读了很多有关序列化和代码的内容,但我不知道如果涉及更多类,如何实现它。在我的 GUI 应用程序中,用户输入的 regNocarTypeDate 信息被发送到协调对象 corObj >,使用这 3 个值创建汽车实例。

  1. 汽车的序列号在哪里?进入 Car 类还是进入 corObj 对象?
  2. 3辆车序列化后,这3辆车如何反序列化?在这里我不是要代码。例如,如果 GUI 中的用户将询问以前保存的汽车的 corObj 对象,那么反序列化代码应该在哪里?在 corObj 或 Car 对象中?

corObj 对象保留对每个创建的汽车实例的引用集合。那么反序列化后 corObj 如何再次引用那些重建的汽车实例呢?

先前创建的汽车实例集合会自动引用回重建的汽车吗?如果不是,其他对象如何获取重建实例的引用?你能给我一些简单的例子吗?

最佳答案

Where does the serialization code for the car go? Into Car class or into corObj object?

假设您使用的是 ObjectOutputStream,序列化数据将流式传输到 ObjectOutoutStream 所包装的任何位置。它可能是使用 FileInputStream 将数据流式传输到驱动器上的文件的本地存储:

File file = new File("car.obj");
FileOutputStream fileOut = new FileOutputStream(file);
ObjectOutputStream objOut = new ObjectOutputStream(fileOut);

objOut.writeObject(new Car()); //write
objOut.close();

FileInputStream fileIn = new FileInputStream(file);
ObjectInputStream objIn = new ObjectInputStream(fileIn);

Car car = (Car) objIn.readObject();

序列化数据的去向取决于您传递给 ObjectOutputStream 构造函数的内容。

上面显示了向本地存储写入/读取本地存储。您可以使用 ByteArrayOutputStream 将数据保存在内存中,或者使用 Socket 中的流通过网络发送数据。

After 3 cars have been serialized how can the 3 cars can be deserialized?

您必须自己跟踪这一点。一旦序列化数据离开流,它实际上就不再存在于您的应用程序中(除非您将其流式传输到内存)。

流的重点是 I/O(输入/输出)——您通过连接将数据发送到某个地方。

可以通过写入ByteArrayOutputStream将其保留在您的应用程序中:

ByteArrayOutputStream arrayOut = new ByteArrayOutputStream();
ObjectOutputStream objOut = new ObjectOutputStream(arrayOut);

//write object

byte[] data = arrayOut.toByteArray(); //must keep a reference to this data! Contains serialized object

ByteArrayInputStream arrayIn = new ByteArrayInputStream(data);
ObjectInputStream objIn = new ObjectInputStream(arrayIn);

//read object

或者您可以通过 FileOutputStream 或来自 Socket 的输出流将其从程序中流出。

File file = new File("car.obj"); //must keep a reference to this file! Specified where serialized object is
ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream(file));

//write object

ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));

//read object

corObj object keeps the collection of references to each created car instance. So after deserialization how can corObj refer again to those reconstructed car instances?

您必须跟踪将这些对象流式传输到的位置。如果流式传输到本地存储,您必须跟踪文件名。如果流式传输到 ByteArrayOutputStream,您必须保留该字节流的引用。

Would the previously created collection of car instances automatically refer back to reconstructed cars

没有。通过反序列化,您正在创建一个新对象。如果序列化集合中的一个对象,然后反序列化该对象而不从集合中删除该对象,那么您现在就有 2 个对象。

<小时/>

我强烈建议阅读我在 What is the penalty for unnecessarily implementing Serializable? 上的回答。如果序列化一个对象,则在反序列化该对象之前修改该对象的类,尝试反序列化该对象可能会失败,因为二进制数据将不再匹配。

关于java - 涉及多个类的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44522776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com