首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@SerialVersionUID在Android上“迷失”?

@SerialVersionUID在Android上“迷失”?
EN

Stack Overflow用户
提问于 2015-01-31 14:47:58
回答 1查看 314关注 0票数 2

我有一个sbt Scala项目:

  1. 子项目库包含一些带有@SerialVersionUID的类,如: @SerialVersionUID(10L)类MyStuff扩展了可序列化的{.}
  2. 项目应用程序是一个Android应用程序(使用android-sdk-plugin),它的依赖项是lib。
  3. 我有一个文件,在我的dev机器(1.7.0_75)上使用本地JVM序列化了许多MyStaff对象。
  4. 当我尝试使用相同的JVM反序列化这个文件时,所有操作都很好。
  5. 当我试图在Android上反序列化这个文件时,使用完全相同的代码,我会得到以下错误消息: java.io.InvalidClassException: com.example.MyStuff;不相容类: com.example.MyStuff:静态终长serialVersionUID =10L;而预期com.example.MyStuff:静态终长serialVersionUID =-7513795898815927590L;

所以,看起来我的serialVersionUID是在向安卓过渡的时候丢失的。知道为什么吗?一些护卫的设置?和Dalvik有关的古怪的东西?我有点傻(很可能是:)

EN

回答 1

Stack Overflow用户

发布于 2015-02-02 22:05:40

看来我可以自己回答问题了。经过一些研究,我想,

  • 我的课没出什么问题
  • Dalvik使用的二进制格式与“常规”JVM之间似乎没有二进制差异。
  • 这是保安的“错”

所以讨论:Serialization / Deserialization & Proguard

还有一篇包含具体细节和解决办法的博客文章:

http://littlepancake.com/2011/09/proguard-and-serialized-java-objects/

归根结底,您需要保护与序列化相关的东西,避免过于狂热的Proguard消除,如下所示:

代码语言:javascript
复制
-keepclassmembers class com.example.full.class.Name {
static final long serialVersionUID;
java.lang.Object writeReplace();
java.lang.Object readResolve();
private static final java.io.ObjectStreamField[] serialPersistentFields;
}

注意,Proguard也理解通配符:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28252880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档