仅当序列化时在父级中也声明了相同的键时,才包括子键

时间:2017-07-19 03:48:20

标签: java serialization gson

我知道它的设计谬误,但我必须处理它。父类和子类中都声明了相同的字段。但是,在序列化时,如果设置了孩子,我希望只包括孩子。

class Parent {

    private int field;
}

class Child extends Parent {

    private int field;
}

public class Main{

    public static void main(String[] args){

        Gson gson = new Gson();
        Child child = new Child();

        System.out.println(gson.toJson(child));
    }
}

但上面的代码抛出错误,表明孩子有重复的字段。我已尝试使用排除策略,但它无法访问字段值以检查是否已设置。我该如何解决这个问题? P.S。 Gson是可选的。如果能给我所需的灵活性,我可以去任何其他图书馆。因此,欢迎图书馆建议。

1 个答案:

答案 0 :(得分:0)

我认为你可以:

1)注册自定义JsonSerializer

private static class ChildSerializer implements JsonSerializer<Child> {
    @Override
    public JsonElement serialize(Child arg0, Type arg1, JsonSerializationContext arg2) {
        JsonObject r = new JsonObject();
        r.add("field", new JsonPrimitive(arg0.getField()));
        return r;
    }
}

public static void main(String[] args) {
    Gson gson = 
        new GsonBuilder().registerTypeAdapter(
            Child.class, 
            new ChildSerializer()
        ).create();

    Child child = new Child();

    System.out.println(gson.toJson(child));
}

这将正确序列化对象。

2)使用@SerializedName Gson注释来序列化具有不同名称的子字段:

@SerializedName("childField") private int field;

当然这意味着您必须在反序列化后更改逻辑,以便考虑反序列化对象的正确字段。 `

3)将字段更改为protected?不知道它是否可行,但是当你只拥有父值或子值时,不会重复。