我们正在开发一个使用RMI进行RPC的多进程项目。
我们面临的问题是必须在进程之间传递的主要对象非常大(在序列化时),这大大降低了代码的性能。
因为,没有一个进程改变整个对象并只改变它的一小部分,我们决定只通过RMI传递“修改”。
但我发现没有适当的方法来实现这样的概念。第一个想法是跟踪主要实例的所有更改。但根据this,这似乎并不容易。
我需要一种方法:
任何建议?
答案 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,但也许您正在寻找上述解决方案。我希望这有帮助。