跟踪实例属性更改

时间:2012-10-17 06:47:48

标签: java class attributes rmi

我们正在开发一个使用RMI进行RPC的多进程项目。

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

因为,没有一个进程改变整个对象并只改变它的一小部分,我们决定只通过RMI传递“修改”。

但我发现没有适当的方法来实现这样的概念。第一个想法是跟踪主要实例的所有更改。但根据this,这似乎并不容易。

我需要一种方法:

  • 快速发展
  • 快速执行

任何建议?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

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

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

-Maddy

答案 3 :(得分:-1)

查看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,但也许您正在寻找上述解决方案。我希望这有帮助。