【问题标题】:JAVA: is it possible to serialize a 3rd party class non serializable with private fields?JAVA:是否可以使用私有字段序列化不可序列化的第 3 方类?
【发布时间】:2017-04-24 15:51:35
【问题描述】:

我试图创建一个中间可序列化类来复制字段,但我不能,因为这些字段是私有的,有什么建议吗?

public class RowSerializable extends Row implements Serializable{

    public Object[] fields;

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

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

【问题讨论】:

  • 也许反射会做到这一点
  • 尝试改用 getter 和 setter.... 是否已定义?
  • 有一个 getter 但它也是私有的

标签: java serialization serializable


【解决方案1】:

您可以使用反射来获取超类中所有字段的值;有关这方面的指导,请参阅 here

然后您可以将该信息存储在您的派生类中;然后你应该能够序列化你的新类的对象。

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

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

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

更新:我认为为了让事情正常工作,您甚至不能在这里使用 inheritance - 因为序列化 遍历 整个继承树。因此,您可能必须首先从代码中删除“扩展行”。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2018-11-22
      • 2016-05-22
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多