我在继承层次结构中有一些类,其状态需要序列化。像这样的东西:
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/