我们正在开发一个使用 RMI 进行 RPC 的多进程项目。
我们面临的问题是必须在进程之间传递的主要对象非常大(当序列化时),这大大降低了代码的性能。
因为,没有一个过程改变整个对象,只改变了它的一小部分,我们决定只通过 RMI 传递“修改”。
但我发现没有合适的方法来实现这样的概念。第一个想法是跟踪主实例的所有变化。但这似乎并不容易。
我需要一种方法,我们可以:
- 快速发展
- 执行速度快
有什么建议吗?
我们正在开发一个使用 RMI 进行 RPC 的多进程项目。
我们面临的问题是必须在进程之间传递的主要对象非常大(当序列化时),这大大降低了代码的性能。
因为,没有一个过程改变整个对象,只改变了它的一小部分,我们决定只通过 RMI 传递“修改”。
但我发现没有合适的方法来实现这样的概念。第一个想法是跟踪主实例的所有变化。但这似乎并不容易。
我需要一种方法,我们可以:
有什么建议吗?
只需将此“主对象”设为实现远程接口的远程对象,然后将其导出,而不是前后序列化。
我认为最好的方法是自定义您的序列化,这样您就可以只发送更改。您可以通过实现 private
void writeObject(java.io.ObjectOutputStream stream) 的私有方法来实现,当然也可以从另一端读取对象。那么,你应该在这个函数中做什么?我建议您管理所有已更改成员的位图并仅在序列化中发送它们,只需将未更改的成员更改为 null 以序列化方式发送对象,然后返回值。在另一边阅读位图,然后你就会知道如何
看看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,但也许您正在寻找上面介绍的解决方案。我希望这有帮助。
第一次你需要传递整个对象。
在对象上使用 PropertyChangeListener,这将生成一个 PropertyChangeEvent。
您可以传递 PropertyChangeEvent。它具有 getSource(),您可以通过它识别对象。如果这还不够,如果您需要 IOR 或任何其他类型的引用,请创建一个包装器并将其发送过去..
-麦迪