我有一个sbt Scala项目:
子项目lib包含一些带有@SerialVersionUID的类,例如:
@SerialVersionUID(10L) class MyStuff扩展了Serializable {...}
Project app是一个Android应用程序(使用android-sdk-plugin),它有lib作为依赖
我有一个文件,在我的开发机器上使用本地JVM序列化了许多MyStaff对象(1.7.0_75)
当我尝试使用相同的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有点时髦吗?我在某种程度上是愚蠢的(最有可能:))
答案 0 :(得分:1)
看起来我可以回答我自己的问题。经过一些研究,我想,
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也了解通配符:)