3

我的应用程序使用http://prevayler.org/进行持久化,搭载 Java 对象序列化。升级到 Android 7.0 (Nougat) 后,用户无法打开他们的数据,因为反序列化不再起作用:

java.io.StreamCorruptedException: invalid type code: 71
  at java.io.ObjectInputStream.readString(ObjectInputStream.java:1647)
  at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1737)
  ...
  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
  at org.prevayler.foundation.serialization.JavaSerializer.readObject(JavaSerializer.java:34)
  ...
  at org.prevayler.PrevaylerFactory.snapshotManager(PrevaylerFactory.java:368)
  at org.prevayler.PrevaylerFactory.create(PrevaylerFactory.java:316)
  at com.tennismath.prevayler.PrevaylerServiceImpl.getSystemPrevayler(PrevaylerServiceImpl.java:51)

在反序列化枚举时,OpenJDK 例程读取“71”的意外字节值并抛出异常,从源代码中可以看出:http: //grepcode.com/file/repository.grepcode.com/java/ root/jdk/openjdk/8u40-b25/java/io/ObjectInputStream.java#ObjectInputStream.readString%28boolean%29

我有以下想法:

  1. 设置一个迁移服务器,它将同时运行 Harmony 和 OpenJDK 进程,从而执行数据迁移。
  2. 破解二进制格式并修复枚举序列化(假设这是唯一一个问题,我对此表示怀疑)
  3. 使用 AspectJ 破解反序列化

所有这些选择似乎都是矫枉过正或不令人满意。在我开始破解二进制文件之前,也许有人对如何使用新的运行时反序列化旧数据有更好的了解?谢谢你。

4

0 回答 0