有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java跟踪实例属性的更改

我们正在进行一个多进程项目,该项目将RMI用于RPC

我们面临的问题是,必须在进程之间传递的主对象非常大(序列化时),这大大降低了代码的性能

由于这些过程都不会改变整个对象,只会改变其中的一小部分,所以我们决定通过RMI传递“修改”

但我没有找到合适的方法来实现这样的概念。第一个想法是跟踪主实例的所有更改。但根据{a1}的说法,这似乎并不容易

我需要一种方法,我们可以:

  • 快速发展
  • 表演快

有什么建议吗


共 (4) 个答案

  1. # 1 楼答案

    我认为最好的方法是自定义序列化,这样您就可以只发送更改。您可以通过实现的私有方法来实现这一点
    私有void writeObject(java.io.ObjectOutputStream)当然还有另一端的readObject。那么,在这个函数中你应该做什么呢? 我建议您管理所有已更改成员的位图,并仅在序列化中发送它们,只需将未更改的成员更改为null并在序列化中发送对象,然后返回这些值。在另一边读位图,你就会知道如何

  2. # 2 楼答案

    看看http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

    public class Test {
        PropertyChangeSupport pcs = new PropertyChangeSupport(this);
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            String oldName = this.name;
            this.name = name;
            pcs.firePropertyChange("name", oldName, name);
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            int oldAge = this.age;
            this.age = age;
            pcs.firePropertyChange("age", oldAge, age);
    
        }
    
        public void addPropertyChangeListener(PropertyChangeListener listener) {
            pcs.addPropertyChangeListener(listener);
        }
    
        public void removePropertyChangeListener(PropertyChangeListener listener) {
            pcs.removePropertyChangeListener(listener);
        }
    
        public Test(){
    
        }
        public static void main (String[] args){
            Test myTestObject = new Test();
            myTestObject.addPropertyChangeListener(new MyPropertyChangeListener());
            myTestObject.setAge(12);
            myTestObject.setName("Rick");
            myTestObject.setName("Andrew");
        }
        private static class MyPropertyChangeListener implements  PropertyChangeListener {
            @Override
            public void propertyChange(PropertyChangeEvent event) {
                String clazz = event.getSource().getClass().getName();
                System.out.println(clazz+"::"+event.getPropertyName()+" changed from "+event.getOldValue()+" to "+event.getNewValue());
            }
        }
    }
    

    这是一个简单的示例,但使用这种方法,您可以创建不同的PropertyChangeListener,并在其方法propertyChange中提供不同的逻辑。 也可以仅对一小部分属性触发更改,而不是对所有属性触发更改(不存储oldValue,也不触发PropertyChangeSupport的firePropertyChange方法)

    当然,您可以使用AOP,但也许您正在寻找如上所述的解决方案。我希望这有帮助

  3. # 3 楼答案

    第一次需要传递整个对象时

    在对象上使用PropertyChangeListener,这将生成PropertyChangeEvent

    您可以传递PropertyChangeEvent。它具有getSource(),通过它可以识别对象。如果这还不够,如果您需要IOR或任何其他类型的引用,请创建一个包装并将其发送到

    -麦迪

  4. # 4 楼答案

    只需将此“主对象”设置为实现远程接口的远程对象,并将其导出,而不是将其前后序列化