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
,则它们不会被序列化,例如联系。序列化与访问级别无关。
我正在尝试创建一个中间可序列化 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
,则它们不会被序列化,例如联系。序列化与访问级别无关。