java - 在 Java 中序列化作为继承层次结构一部分的对象?

标签 java

我在继承层次结构中有一些类,其状态需要序列化。像这样的东西:

public class Base {
    private int b;

    public void serialize(Writer w) {
        w.write(b);
    }
}

public class DerivedA extends Base {
   private int a;

   public void serialize(Writer w) {
      super.serialize(w);
      w.write(a, some_option);
}

public class DerivedC extends Base {
   private int c;

   public void serialize(Writer w) {
       super.serialize(w);
       w.write(c, some_other_option);
   }
}

将其扩展到几十个类,每个类有几十个成员,这会带来一些维护问题。我想通过将成员更改为属性对象来编码此逻辑,然后使用反射或其他方法来查找要序列化的字段。

尽管如此,我无法找到获取类的所有继承字段的好方法,特别是继承链比玩具示例更深。最好的方法是什么?

最佳答案

首先,称其为“静态行为”有点误导。这意味着您正在谈论静态方法。但事实并非如此,而且(从技术上来说)Java static 方法和字段无论如何都不可继承/可继承。

您问题的核心是:

I can't figure out a good way to get all of a class' inherited fields [using reflection], especially with inheritance chains deeper than the toy example. What's the best way to do this?

方法是访问父类(super class)的目标类链中的所有类,调用Class::getDeclaredFields()来获取该类声明的所有字段。 (这不包括继承的字段......因此需要遍历链。)对于返回的每个字段,您需要根据类型和修饰符。对于私有(private)字段,您需要使用 Field::setAccessible。这是昂贵的,因此典型序列化器实现捕获它需要的信息并缓存它。

这可能看起来不是一个“好”方法,但据我所知,这是唯一的方法......假设您正在实现自己的序列化框架。另一种方法是使用预先存在的序列化框架;例如对象流、JAXB、Jackson、GSON 等。或者基于JPA或JDP的数据持久化机制。

关于java - 在 Java 中序列化作为继承层次结构一部分的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50547200/

相关文章:

java - 如何为正在编写 Reactor Context 的 WebFilter 编写单元测试?具体来说,我要模拟什么以及如何模拟?

java - 如何使用 Spring 订阅传入的 SSE 事件

java - 两个版本的 Scanner 之间有什么区别?

java - 如何在java中比较两个hashmap?

java - 如何解决JNA这个问题?

java - Apache Spark : Classloader cannot find classDef in the jar

java - ORA-01830 : date format picture ends before converting entire input string - JAVA/Oracle

java - 如何修复位于另一个预先绘制的 JPanel 之上的 JPanel 上的动态移动图像的闪烁?

java - Spring Boot 与基于 session 的数据源

java - 为什么我的 Eclipse 框架在通过插件启动 java 应用程序时停止工作,而当我退出该应用程序时 Eclipse 停止工作