JAVA: 是否可以序列化第 3 方 class 不可序列化的私有字段?

JAVA: is it possible to serialize a 3rd party class non serializable with private fields?

我正在尝试创建一个中间可序列化 class 以复制字段,但我做不到,因为这些字段是私有的,有什么建议吗?

public class RowSerializable extends Row implements Serializable{

    public Object[] fields;

    public RowSerializable(int arity, Row a) {
        super(arity);
        this.fields = a.fields;
    }
}

问题是行类型字段是私有的private final Object[] fields;

您可以使用反射来从您的 superclass 获取所有字段的值;有关指导,请参阅 here

然后您可以将该信息存储在派生的 class 中;然后您应该能够序列化新 class.

的对象

丑陋的当然是:在反序列化时,您还必须使用反射将 RowSerializable 的所有字段值推回 Row 父字段。

所有这些在技术上可能都是可行的,但当然,这不是一个非常可靠的解决方案。示例:当使用该 Row class 的新版本时,对于之前使用旧版本 Row.class 序列化的 Row 实例,这可能根本不起作用。

因此,我个人的两分钱:这样做时要非常小心。感觉像是一个绝对不是免费的肮脏黑客。

更新:我认为为了让事情正常工作,你甚至不能在这里使用 inheritance - 因为序列化 walks 整个继承树。因此,您可能必须首先从您的代码中删除 "extends Row"。

私有字段将被序列化,如果它们被声明 transient,则它们不会被序列化,例如联系。序列化与访问级别无关。