4

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

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

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

但我发现没有合适的方法来实现这样的概念。第一个想法是跟踪主实例的所有变化。但这似乎并不容易

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

  • 快速发展
  • 执行速度快

有什么建议吗?

4

4 回答 4

0

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

于 2012-10-18T04:41:02.027 回答
0

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

于 2013-01-30T13:01:33.953 回答
-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,但也许您正在寻找上面介绍的解决方案。我希望这有帮助。

于 2012-10-18T08:34:20.770 回答
-1

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

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

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

-麦迪

于 2012-10-17T07:12:30.900 回答