Serial version id mismatch issue between server and client class
我面临串行版本ID不匹配的问题。
我的服务器有serialversionid=20150301L的代码;而myt客户端代码存在差异,因此手动更改它,但仍然面临相同的问题。
错误:
1
| java. rmi. UnmarshalException: error unmarshalling arguments ; nested exception is : java. io. InvalidClassException: com. fedex. supplies. j2ee. common. client. reqresp. CustomerDataRequest; local class incompatible : stream classdesc serialVersionUID = 20150901L, local class serialVersionUID = -955959537118369236. |
我尝试了类似实现可序列化的选项,手动定义的serialversionid与服务器相同,但每次都会得到相同的错误。
- 如果您手动更改它,它不会给出相同的错误。local class serialVersionUID是您指定的数字。如果它没有改变,你就没有正确设置和更新你的代码。
- 您能告诉我们您如何在代码中设置serialVersionUID?
- 换句话说,您必须将它设置为流中的内容,20150901L。
- 必须是private static final long。
- 检查部署策略。确保您部署的包/类与您在项目中使用的包/类相同。这意味着您不应该在两个不同的点上设置和编译serialversionid,而应该只在一个点上设置和编译serialversionid(并复制已编译的类,例如在jar中)。
- @。我正在使用服务器jar(其中指定了serialversionid)并将客户机代码部署在deffrant包中…
- 是否将类从服务器JAR导入到客户机代码中?
- @陶菲克皮尔杰德你不能那样做。序列化类和反序列化中存在的类至少必须在名称、包和serialVersionUID中达成一致。但如果你真的使用了不同的软件包,你就不会有这个例外了。请澄清。
尝试以下代码
1
| private static final long serialVersionUID = 20150901L; |
如果你不做private和static和final,它将被忽略。
- 根据对象序列化规范,它也必须是final。
- @EJP感谢您的更正和链接。我从未试图让它成为非决赛。;
- 我想我已经做过几次非private。规范真的很模糊。
- @彼得拉弗里不为我工作显示同样的错误…(
- @Taufikirjade不可能。您已经更改了本地ClassDesc。它不能与以前的错误相同,因为旧错误具有旧的本地ClassDesc。如果你换了它从哪里得到的?您确定要运行新代码吗?