在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();}
}
client.jar中:
MyParent foo = myClass.getFoo();
如果所有3个罐子都放在一个类加载器中,则一切正常.
但是,客户端和服务器位于以下不同的JVM中:
> JVM-1包含:server.jar,shared.jar
> JVM-2包含:client.jar,shared.jar
客户端呼叫服务器.服务器返回MyConcreteClass,Java未能反序列化它(ClassNotFoundException).
我想做什么:
>服务器对类进行序列化并发送数据和类的祖先集
>客户找到可能反序列化的最窄祖先.
一切正常:我们在客户端上有MyParent实例,这就是我们所需要的.
我不敢相信没有这样的引擎.你认识一个吗
我确信远程通话应尽可能类似于本地通话.
谢谢.
解决方法:
实际上,我找到了解决方案并制作了一个特殊的程序包来支持它:
> MyParent对我来说带有特殊的SerializableParent批注.此注释意味着在远程引擎可以序列化任何子类并将其通过电线传输之前,应将其子类“转换”为MyParent.通过设置此批注,不仅可以告诉系统MyParent存在于远程JVM上,而且层次结构树也不需要多态性:如果子级覆盖父级的方法,则它在远程系统上将不可用,因为只能发送数据而可以发送代码.
>在发送结果引擎之前,应找到注释为SerializableParent的最窄祖先
>应该序列化为XML(例如XStream)并使用父类作为子代别名反序列化的对象.为了防止出现“未知字段”错误,必须重写WrapMapper和shouldSerializeMember来入侵Xstream.
>您已将“可串行化的父母”转移