您能帮助我理解如何实现序列化。我已经阅读了很多关于序列化和代码的内容,但如果涉及更多的类,我不知道如何实现它。在我的GUI应用程序中,用户的输入将regNo
,carType
和Date
信息发送到协调对象corObj
,该协调对象创建具有这3个值的汽车实例。
corObj
对象? corObj
对象以前保存的汽车,那么反序列化代码应该在哪里?在corObj
或Car对象中? corObj
对象保留对每个创建的汽车实例的引用集合。
因此,在反序列化之后,corObj如何再次引用那些重建的汽车实例?
先前创建的汽车实例集合是否会自动返回重建的汽车?如果不是其他对象如何获得重建实例的引用?你能举个简单的例子吗?
答案 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
或者您可以通过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对象保留对每个已创建的汽车实例的引用集合。因此,在反序列化后,corObj如何再次引用那些重建的汽车实例?
您必须跟踪将这些对象传输到的位置。如果要流式传输到本地存储,则必须跟踪文件名。如果流式传输到ByteArrayOutputStream
,则必须保留该字节流的引用。
先前创建的汽车实例集合是否会自动返回重建的汽车
没有。通过反序列化,您将创建一个新对象。如果序列化集合中的对象,然后反序列化该对象而不从集合中删除该对象,则现在有2个对象。
我强烈建议您在What is the penalty for unnecessarily implementing Serializable?上阅读我的答案。如果序列化对象,则在反序列化对象之前修改该对象的类,尝试反序列化该对象可能会失败,因为二进制数据将不再匹配。