java 序列化远程通讯_java-将远程对象反序列化为最窄的可访问类

在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.

>您已将“可串行化的父母”转移

标签:java,spring,serialization,rmi

来源: https://codeday.me/bug/20191009/1882940.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值