我有一个 sbt Scala 项目:
子项目lib中包含一些带有@SerialVersionUID的类,例如:
@SerialVersionUID(10L) class MyStuff extends Serializable { ... }
Project app 是一个 Android 应用程序(使用 android-sdk-plugin),它有 lib 作为它的依赖
我有一个文件,我在我的开发机器 (1.7.0_75) 上使用本地 JVM 将许多 MyStaff 对象序列化到该文件中
当我尝试使用相同的 JVM 反序列化此文件时,一切正常
当我尝试在 Android 上使用完全相同的代码反序列化此文件时,我收到以下错误消息:
java.io.InvalidClassException: com.example.MyStuff;不兼容类 (SUID):com.example.MyStuff:static final long serialVersionUID =10L;但预期 com.example.MyStuff: static final long serialVersionUID =-7513795898815927590L;
所以,看起来我的 serialVersionUID 在过渡到 Android 的过程中丢失了。任何想法为什么?一些proguard设置? Dalvik 有什么奇怪的地方吗?我有点愚蠢(很可能 :) )
最佳答案
看来我可以回答我自己的问题了。经过一些研究,我发现,
- 我的课没有问题
- Dalvik 使用的二进制格式与“常规”JVM 之间似乎没有二进制差异
- 这是 Proguard 的“错”
SO 讨论:Serialization / Deserialization & Proguard
还有一篇包含具体细节和解决方法的博文:
http://littlepancake.com/2011/09/proguard-and-serialized-java-objects/
归结为一个事实,即您需要保护与序列化相关的内容免受过分热心的 Proguard 消除,如下所示:
-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 也理解通配符:)
关于android - @SerialVersionUID "lost"在 Android 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28252880/