Android上@SerialVersionUID“丢失”?

时间:2015-01-31 14:47:58

标签: android scala serialization

我有一个sbt Scala项目:

  1. 子项目lib包含一些带有@SerialVersionUID的类,例如:

    @SerialVersionUID(10L) class MyStuff扩展了Serializable {...}

  2. Project app是一个Android应用程序(使用android-sdk-plugin),它有lib作为依赖

  3. 我有一个文件,在我的开发机器上使用本地JVM序列化了许多MyStaff对象(1.7.0_75)

  4. 当我尝试使用相同的JVM反序列化此文件时,一切正常

  5. 当我尝试在Android上反序列化此文件时,使用完全相同的代码,我收到以下错误消息:

    java.io.InvalidClassException:com.example.MyStuff;不兼容的类(SUID):com.example.MyStuff:static final long serialVersionUID = 10L;但是预计com.example.MyStuff:static final long serialVersionUID = -7513795898815927590L;

  6. 所以,看起来我的serialVersionUID在转换到Android时丢失了。有什么想法吗?一些proguard设置? Dalvik有点时髦吗?我在某种程度上是愚蠢的(最有可能:))

1 个答案:

答案 0 :(得分:1)

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

  • 我的课程没有任何问题
  • Dalvik使用的二进制格式与#34;常规"之间似乎没有二元差异。 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也了解通配符:)