gpt4 book ai didi

android - @SerialVersionUID "lost"在 Android 上?

转载 作者:行者123 更新时间:2023-11-29 01:35:42 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com