Java 将远程对象反序列化为最窄的可访问类

Java 将远程对象反序列化为最窄的可访问类,java,spring,serialization,rmi,Java,Spring,Serialization,Rmi,在shared.jar中,我有: jar包含 client.jar: 如果所有3个jar都在一个类加载器中,那么一切都很好 但客户端和服务器位于不同的JVM中,而: JVM-1包含:server.jar、shared.jar JVM-2包含:client.jar、shared.jar 客户端调用服务器。服务器返回MyConcreteClass,Java无法对其进行反序列化ClassNotFoundException 我想做的是: 服务器序列化类并发送数据和类的祖先集 客户端找到它可能反序列化的最

在shared.jar中,我有:

jar包含

client.jar:

如果所有3个jar都在一个类加载器中,那么一切都很好

但客户端和服务器位于不同的JVM中,而:

JVM-1包含:server.jar、shared.jar JVM-2包含:client.jar、shared.jar 客户端调用服务器。服务器返回MyConcreteClass,Java无法对其进行反序列化ClassNotFoundException

我想做的是:

服务器序列化类并发送数据和类的祖先集 客户端找到它可能反序列化的最窄祖先。 一切正常:客户端上有MyParent的实例,这就是我们需要的

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


谢谢。

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

MyParent已用特殊的SerializableParent注释标记给我。此注释意味着任何子类都应该转换为MyParent,然后远程处理引擎才能序列化它并通过网络传输它。通过设置此注释,您不仅可以告诉系统MyParent存在于远程JVM上,而且层次结构树不需要多态性:如果子级重写父级的方法,它将在远程系统上不可用,因为只能发送数据而不能发送代码。 在发送结果之前,引擎应该找到注释为SerializableParent的最窄祖先 对象,该对象应以XStream为例序列化为XML,并使用父类作为子类的别名反序列化。为了防止未知字段错误,必须通过重写wrappapper和shouldSerializeMember对Xstream进行黑客攻击。 您有要传输的可序列化父级
实现java.io.Serializable接口的对象可以使用writeReplace和readResolve方法来替换另一个对象,以替换正在序列化/反序列化的对象。我可以看到这被用来解决你的问题。但是,我自己还没有尝试过。

您是说动态代理吗?
abstract class MyParent {

}
abstract class MyClass {
   MyParent getFoo();
}
abstract class MyChild extends MyParent {

}
abstract class MyClassConcrete {
   MyParent getFoo() {return new MyChild();}
}
MyParent foo = myClass.getFoo();