java - 如何用我自己的 readObject 调用替换 Java 的默认反序列化?

标签 java deserialization

有人认为使用 Java 的默认序列化方法将数据库中的对象存储在 blob 列中是个好主意。 这些对象的结构由另一个组控制,他们将字段类型从 BigDecimal 更改为 Long, 但我们数据库中的数据保持不变。 现在我们无法读回对象,因为它会导致 ClassCastExceptions。

我试图通过编写自己的 readObject 方法来覆盖它, 但这会抛出 StreamCorruptedException,因为默认的 writeObject 方法写入了什么。

如何使我的 readObject 调用表现得像 Java 的默认调用? 我可以跳过一定数量的字节来获取我的数据吗?

最佳答案

Externalizable允许您完全控制序列化/反序列化。但这意味着您负责编写和阅读每个领域,

当使用默认序列化写出某些内容并且您想通过 Externalizable 读取它时会变得困难。 (或者更确切地说,这是不可能的。如果您尝试使用 Externalizable 读取使用默认方法序列化的对象,它只会抛出异常。)

如果您完全无法控制输出,您唯一的选择是保留类的两个版本:使用旧版本的默认反序列化,然后转换为新版本。这个解决方案的好处是它将“脏”代码保存在一个地方,与你漂亮干净的对象分开。

同样,除非您想做的事情真的很复杂,否则最好的选择是将旧类保留为“传输”bean,并将您的代码真正使用的类重命名为其他名称。

关于java - 如何用我自己的 readObject 调用替换 Java 的默认反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26260423/

相关文章:

c# - 无法反序列化当前的 JSON 数组(例如 [1,2,3])。 C#,无法找出错误

java - 反序列化Java数据结构中的文本

c# - xsd 类型 ="anySimpleType"属性

java - 如何在 GWT 表单面板中发布整个页面

java - 如果我有 jdbc :mysql://localhost:3306,我会在 Class.forName 中写什么

java - Java 2d int 数组考虑器是否通用?为什么?

c# - 使用 XmlReader 和 xsd.exe 中的类反序列化 Xml

java - 使用GSON将JSON数据转换为Java对象(包括Object类)

java - 进行 InApp 计费时如何保护 Google Play 公钥

java - char[] -> String -> bytes[] -> String...我迷路了