android - @SerialVersionUID "lost"在 Android 上?

标签 android scala serialization

我有一个 sbt Scala 项目:

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

    @SerialVersionUID(10L) class MyStuff extends Serializable { ... }

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

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

  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;

所以,看起来我的 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/

相关文章:

android - 在android google map api中修改多边形

android - 透明操作栏下方的抽屉导航

android - 关闭带有系统签名应用程序的 Android 设备

scala - SBT、println 和 Scala 控制台应用程序的奇怪问题

django - 序列化 Django 请求

android - AppCompatImageButton 不能转换为 android.widget.Button,即使它不是 ImageButton

Scala 语法部分

scala - 根据类型参数生成函数

asp.net - 如何验证我的 ASP.NET session 数据是否可以正确序列化?

java - 在 Java 中反序列化一个序列化的 php 对象