我的应用程序使用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
我有以下想法:
- 设置一个迁移服务器,它将同时运行 Harmony 和 OpenJDK 进程,从而执行数据迁移。
- 破解二进制格式并修复枚举序列化(假设这是唯一一个问题,我对此表示怀疑)
- 使用 AspectJ 破解反序列化
所有这些选择似乎都是矫枉过正或不令人满意。在我开始破解二进制文件之前,也许有人对如何使用新的运行时反序列化旧数据有更好的了解?谢谢你。