【问题标题】:@SerialVersionUID "lost" on Android?@SerialVersionUID 在 Android 上“丢失”?
【发布时间】:2015-01-31 14:47:58
【问题描述】:

我有一个 sbt Scala 项目:

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

    @SerialVersionUID(10L) 类 MyStuff 扩展可序列化 { ... }

  2. 项目应用程序是一个 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设置?达尔维克有什么奇怪的吗?我有点愚蠢(很可能:))

【问题讨论】:

    标签: android scala serialization


    【解决方案1】:

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

    • 我的课没有错
    • 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 也可以理解通配符 :)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2019-03-12
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多