在通过ObjectInputStream发送时,如何更新对象而不是完全重写

时间:2017-07-14 21:01:36

标签: java sockets serialization objectoutputstream backreference

以下实现更新通过ObjectOutputStream发送的对象(在这种情况下使用套接字),但每次更新对象时都必须完全重写对象,否则对象使用后引用引用旧的发送的对象,不看新的对象。我不知道如果这样的事情每秒更新几次就会出现性能问题,但有没有办法更有效地做到这一点?

ObjectOutputStream objectOS = new ObjectOutputStream(connectionSocket.getOutputStream());
while(true){

        objectOS.reset(); // Disgregard any objects already written to stream

        System.out.println(kingBob.currentAge);
        objectOS.writeObject(kingBob);

        System.out.println("Update HP");
        kingBob.updateCurrentAge(keyboard.nextInt());

}

1 个答案:

答案 0 :(得分:1)

Java并没有真正拥有复制或更新对象的内置概念,甚至检测差异,您可以获得的最接近的是将对象序列化为数组并返回复制它,这显然很慢并且仍需要一些支持。

关键是你必须自己做,但你可以编写更通用的代码。

只有少数"东西"在java中。有内在的类型和类扩展"对象"。如果你传递两个"对象"对于一个方法,该方法可以迭代相同类型的两个对象,反射性地配对字段,识别每个字段的类型 - 如果字段是内在的,则复制该值,如果该字段是子类,则递归那个班级来复制IT的成员。这样可以保持原始参考文献的完整性。

这有点痛苦但可行 - 也许现在有人在那里写了一个图书馆,我不得不手工做..

如果它适合您的问题空间,那么更好的选择可能是查看RMI解决方案。如果您的对象是" Remote"然后调用者可以直接调用你的一个setter。

注意:我的问题与你的问题完全不同,但它很接近,我必须检测两个数据库之间的更改对象,复制一些更改并记录它们。我最后注释了我想复制的字段。当你必须使用反射时 - 注释非常有用。