2015-01-31 2 views
2

У меня есть проект SBT Scala:@SerialVersionUID «потерян» на Android?

  1. подпроекта Lib содержит некоторые классы с @SerialVersionUID, например, в:

    @SerialVersionUID (10L) класс MyStuff распространяется Serializable {...}

  2. приложение Project является Android приложение (использует андроид-СДК-плагин), он импровизировать, как его зависимость

  3. у меня есть файл, в который я SER ialized ряд объектов MyStaff, используя локальную JVM на моем Dev машины (1.7.0_75)

  4. Когда я пытаюсь десериализации этот файл, используя ту же JVM, все работает отлично

  5. Когда я пытаюсь десериализации этот файл на Android, используя точно такой же код, появляется следующее сообщение об ошибке:

    java.io.InvalidClassException: com.example.MyStuff; Несовместимый класс (SUID): com.example.MyStuff: статический окончательный длинный serialVersionUID = 10L; но ожидаемый com.example.MyStuff: статический окончательный длинный serialVersionUID = -7513795898815927590L;

Итак, похоже, что мой serialVersionUID был потерян при переходе на Android. Любые идеи почему? Некоторые настройки proguard? Что-то напуганное с Дальвиком? Мне как-то глупо (скорее всего :))

ответ

1

Похоже, я могу ответить на свой вопрос. После некоторых исследований я понял, что

  • Там не было ничего плохого в моих классах
  • Там, кажется, нет двоичного несоответствия между двоичным форматом, используемым Dalvik и «обычным» виртуальной машиной Java
  • Это «вина» 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 понимает символы, а :)

+0

Для примера, охватывающего все классы, посмотрите здесь: https://www.guardsquare.com/en/proguard/manual/examples#serializable – Nate