0

shared.jar我有:

abstract class MyParent {

}
abstract class MyClass {
   MyParent getFoo();
}

server.jar包含

abstract class MyChild extends MyParent {

}
abstract class MyClassConcrete {
   MyParent getFoo() {return new MyChild();}
}

客户端.jar

MyParent foo = myClass.getFoo();

如果所有 3 个 jar 都在一个类加载器中,那么一切正常。

但是客户端和服务器在不同的 JVM 中,同时:

  • JVM-1 包含:server.jarshared.jar
  • JVM-2 包含:client.jarshared.jar

客户端调用服务器。服务器返回MyConcreteClass并且 Java 无法对其进行反序列化(ClassNotFoundException)。


我想做的事:

  • 服务器序列化类并发送数据和类的祖先集
  • 客户端找到它可能反序列化的最窄的祖先。

一切都很好:我们在客户端上有MyParent的实例,这就是我们所需要的。

我不敢相信没有这样的引擎。你认识一个吗?我确信远程呼叫应该尽可能类似于本地呼叫。

谢谢。

4

2 回答 2

0

实现 java.io.Serializable 接口的对象可以使用 writeReplace() 和 readResolve() 方法将另一个对象替换为正在序列化/反序列化的对象。我可以看到这被用来解决您的问题。但是,我自己没有尝试过。

于 2012-04-23T19:50:28.370 回答
0

实际上我找到了解决方案并制作了一个特殊的包来支持它:

  • MyParent必须用特殊的SerializableParent注释标记。这个注释意味着任何子类都应该在远程引擎可以序列化它并通过网络传输之前“转换”为MyParent 。通过设置此注释,您不仅可以告诉系统MyParent存在于远程 JVM 上,而且层次结构树不需要多态性:如果子级覆盖父级的方法,它将在远程系统上不可用,因为只能发送数据但可以发送代码。
  • 在发送结果引擎之前,应该找到注释为 SerializableParent的最窄祖先
  • 应该序列化为 XML(例如使用 XStream)并使用父类作为子类别名反序列化的对象。为了防止“未知字段”错误,Xstream 必须通过覆盖wrapMappershouldSerializeMember来破解。
  • 你有“可序列化的父母”被转移
于 2012-04-20T20:25:51.543 回答