涉及多个类

时间:2017-06-13 13:20:37

标签: java serialization

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

  1. 汽车的序列化代码在哪里?进入Car类或corObj对象?
  2. 3辆车被序列化之后如何才能对3辆车进行反序列化?在这里,我不是要求代码。例如,如果来自GUI的用户会询问corObj对象以前保存的汽车,那么反序列化代码应该在哪里?在corObj或Car对象中?
  3. corObj对象保留对每个创建的汽车实例的引用集合。 因此,在反序列化之后,corObj如何再次引用那些重建的汽车实例?

    先前创建的汽车实例集合是否会自动返回重建的汽车?如果不是其他对象如何获得重建实例的引用?你能举个简单的例子吗?

1 个答案:

答案 0 :(得分:1)

  

汽车的序列化代码在哪里?进入Car类还是进入corObj对象?

假设您正在使用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的流通过网络发送数据。

  

3辆汽车被序列化之后如何才能对3辆汽车进行反序列化?

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

流的点是用于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

或者您可以通过FileOutputStreamSocket的输出流将其从您的计划中流式传输。

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对象保留对每个已创建的汽车实例的引用集合。因此,在反序列化后,corObj如何再次引用那些重建的汽车实例?

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

  

先前创建的汽车实例集合是否会自动返回重建的汽车

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

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