如何使扩展非可序列化的java类可序列化

Posted

技术标签:

【中文标题】如何使扩展非可序列化的java类可序列化【英文标题】:How to make a java class serializable that extends a non serializable 【发布时间】:2015-12-21 01:37:22 【问题描述】:
MyClass1 extends MyClass2 implements Serializable

我正在尝试通过使用

在 HashMap 上的 android 应用程序中使用 saveOnInstanceState
 savedInstanceState.getSerializable()

我已经对使用自定义类的其他哈希映射进行了此操作,但是通过使这些类可序列化但是即使在我使这个可序列化之后我似乎也遇到了错误,因为 MyClass2 不可序列化。 MyClass2 是第三方库,因此我无法修改它并使其可序列化,有什么我可以做的吗?

谢谢!

【问题讨论】:

不幸的是你不能。如果你能做到这一点,那将是一个安全漏洞,因为你可以序列化每个类,即使该类不应该这样做。 【参考方案1】:

正如 Jan 的回答所述,您通常不能这样做。在某些情况下,有一些变通办法可以做到这一点,但即使它们起作用,它们也有点脆弱。要获得此机会,您需要具备以下条件才能申请:

您对超类结构有足够的洞察力,可以了解捕获其当前状态所需的数据。 您需要能够访问(通过公共或受保护的成员变量或通过 getter 之类的东西)获取捕获其当前状态所需的数据。 您需要具有访问权限(通过公共或受保护的成员变量或通过 setter 之类的东西)来更改重建其当前状态所需的数据字段。 您需要使用serialPersistentFields 方法或精心构造的writeObject / readObject 一对实现,在序列化和反序列化期间从超类保存/读取数据。这必然需要了解和访问前面项目符号中描述的超类结构。 超类必须有一个无参数的构造函数。 (这对于序列化无关紧要,但在反序列化时需要它。)

当然,在做这一切的过程中,你会用到一些超类的知识,这意味着如果超类的实现发生变化,这可能会以难以找到的方式中断。

【讨论】:

【参考方案2】:

很遗憾,你不能。如果你能做到这一点,那将是一个安全漏洞,因为你可以序列化每个类,即使该类不应该这样做。

【讨论】:

以上是关于如何使扩展非可序列化的java类可序列化的主要内容,如果未能解决你的问题,请参考以下文章

在 Boost.MPI 中使类可序列化是啥意思?

在Boost.MPI中使类可序列化是什么意思?

如何在 .net 中使类可序列化而无需 Serializable 属性

为啥我不应该让一个类可序列化?

IOIO序列化

java中的Serializable接口的作用