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

Bry*_*ill 6 java deserialization

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

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

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

use*_*421 1

如果您想读取数据库中已有的内容,您唯一的选择是让他们再次更改类,并让他们意识到您依赖于类序列化时的类定义。仅仅实现您自己的 readObject() 调用无法解决此问题,并且如果该类处于其他人的控制之下,您无论如何也无法这样做。

如果您准备丢弃现有数据,那么您还有许多其他选择,从自定义序列化、writeReplace()/readResolve()、Externalized 等开始,或者使用不同的机制(例如 XML)。

但如果你想让第三方随时改变事情,你总是会遇到这样或那样的问题。

无论如何,BigDecimal 到 Long 听起来像是一种倒退。