[英]With out implementing a Serializable interface is it possible to make a class persistable in java?
[英]In java, is it possible to add the Serializable interface to class that doesn't have it at runtime?
有一个我想序列化的类,它实现了Serializable,但它包含的一个对象没有实现Serializable。
有没有办法在运行时修改类以使其实现Serializable接口,以便我可以序列化它? 我无法在编译时更改它,因为它是第三方库。
也许我将不得不使用某种字节码编写器或什么?
编辑:包含类和包含类都在第三方库中,所以我不认为我可以标记为瞬态。 包含的类被标记为可序列化,但它包含的对象不是。
我为这个类编写自定义序列化方法很好,但不知道我会怎么做,我是否必须使用反射来获取私有变量的值?
阅读Serializable的javadoc,我看到:
在序列化和反序列化过程中需要特殊处理的类必须使用这些精确签名实现特殊方法:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
您可以使用它来手动序列化不合作的字段。 你可以考虑使用ASM,但似乎很难相信它是一个可维护的解决方案。
可以使用transient
修饰符跳过字段。 可以通过提供readObject
和writeObject
方法将其他数据添加到流中。 可以对类进行子类化以使其可序列化(尽管您需要管理超类数据),或使用串行代理(请参阅Effective Java)。
如果一个类没有标记为Serializable,那可能是有充分理由的(以数据库连接为例)。 因此,如果您确实需要序列化该对象,首先要清楚自己。 如果只需要序列化周围的对象,可以考虑将包含的对象标记为瞬态。
您可以使用java.lang.reflect.Proxy将Serializable接口添加到您没有生命周期控制的对象实例(即不能对它们进行子类化)并以这种方式对它们进行序列化。 但是如果没有另一个黑客(即引入代理类),你仍然无法阅读它们。
我建议一般寻找Java Serializable机制的替代方案。 它在很多方面都被设计破坏了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.