如何仅使用Gson存储非默认值

时间:2016-01-30 19:22:34

标签: java serialization gson deserialization

我制作了一个litte序列化系统,该系统使用Gson并且只影响具有特定Fields的{​​{1}}。

Annotation

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Store { String valueName() default ""; boolean throwIfDefault() default false; } 确定throwIfDefault()是否应该保存到文件中,如果它的值等于默认值(我通过比较字段的值来检查它)相同的字段,但在类的静态实例中)。

它完美无缺,但我想要实现的目标是FieldMapArray对象同样适用:

如果这些Set的条目未包含在该特定objects的默认设置中,则只应保存这些条目。

它还必须用于反序列化:

应在反序列化期间添加尚未加载的Field中的默认值,或者首先加载默认值object,然后使用加载的object的条目进行修改。

这可以通过为这些object创建自定义Json(De)Serializer来实现,或者您将如何实现?

这里是反序列化部分:

obejcts

1 个答案:

答案 0 :(得分:2)

让我们说你的JSON对象是

{"defParam1": 999,
 "defParam2": 999,
 "defParam3": 999,
 "param4": 999,
 "param5": 999,
 "param6": 999}

不会设置参数defParam1,defParam2,defParam3。

使用默认参数

将JSON对象解析为特定对象

默认参数在构造函数中设置,因此您不需要使用注释

您的Java对象是:

public class ObjStore {
    public ObjStore(){
        this(false);
    }
    // Load default parameters directly into the constructor
    public ObjStore(boolean loadDefault){
        if( loadDefault ){
            defParam1 = 123; // (int) DefaultRegistrator.getDefault("ObjStore", "defParam1");
            defParam2 = 123; // (int) DefaultRegistrator.getDefault("ObjStore", "defParam2");
            defParam3 = 123; // (int) DefaultRegistrator.getDefault("ObjStore", "defParam3");
        }
    }
    public int getDefParam1() {
        return defParam1;
    }

    public int getDefParam2() {
        return defParam2;
    }

    public int getDefParam3() {
        return defParam3;
    }

    public int getParam4() {
        return param4;
    }

    public void setParam4(int param4) {
        this.param4 = param4;
    }

    public int getParam5() {
        return param5;
    }

    public void setParam5(int param5) {
        this.param5 = param5;
    }

    public int getParam6() {
        return param6;
    }

    public void setParam6(int param6) {
        this.param6 = param6;
    }

    private int defParam1;
    private int defParam2;
    private int defParam3;
    private int param4;
    private int param5;
    private int param6;
}

对于反序列化,您需要以这种方式注册新的自定义typeAdapter:

GsonBuilder gsonBuilder = new GsonBuilder();

gsonBuilder.registerTypeAdapter(ObjStore.class, new JsonDeserializer<ObjStore>() {
    public ObjStore deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        ObjStore objStore = new ObjStore(true);
        JsonObject jo = json.getAsJsonObject();
        objStore.setParam4( jo.get("param4").getAsInt() );
        objStore.setParam5(jo.get("param5").getAsInt());
        objStore.setParam6(jo.get("param6").getAsInt());
        return objStore;
    }
});

Gson gson = gsonBuilder.create();

使用以下命令解析JSON对象:

ObjStore objStore = gson.fromJson("{\"defParam1\": 999,\"defParam2\": 999,\"defParam3\": 999,\"param4\": 999,\"param5\": 999,\"param6\": 999}", ObjStore.class);

使用默认参数

将JSON对象解析为Map对象

默认参数在构造函数中设置,因此您不需要使用注释。

定义包装Map对象的这个类

public class ObjMapStore {
    public ObjMapStore(){
        this(true);
    }
    public ObjMapStore(boolean loadDefault){
        map = new HashMap<>();
        if(loadDefault){
            map.put("defParam1", 123); // (int) DefaultRegistrator.getDefault("ObjMapStore", "defParam1");
            map.put("defParam2", 123); // (int) DefaultRegistrator.getDefault("ObjMapStore", "defParam2");
            map.put("defParam3", 123); // (int) DefaultRegistrator.getDefault("ObjMapStore", "defParam3");
        }
    }

    public void put(String key, Object value){
        map.put(key, value);
    }

    public Map<String, Object> getMap(){
        return map;
    }
    private Map<String, Object> map;
}

再次对于反序列化,您需要以这种方式注册新的自定义typeAdapter:

GsonBuilder gsonBuilder = new GsonBuilder();

gsonBuilder.registerTypeAdapter(ObjMapStore.class, new JsonDeserializer<ObjMapStore>() {
    public ObjMapStore deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        ObjMapStore objMapStore = new ObjMapStore();
        JsonObject jo = json.getAsJsonObject();
        objMapStore.put("param4", jo.get("param4").getAsInt());
        objMapStore.put("param5", jo.get("param5").getAsInt());
        objMapStore.put("param6", jo.get("param6").getAsInt());
        return objMapStore;
    }
});

Gson gson = gsonBuilder.create();

在使用此方法获取地图对象之前已完成:

Map<String, Object> objMapStore = gson.fromJson("{\"defParam1\": 999,\"defParam2\": 999,\"defParam3\": 999,\"param4\": 999,\"param5\": 999,\"param6\": 999}", ObjMapStore.class).getMap();

保持对此调用.getMap();的警觉,因为允许您将定义的Map定义到ObjMapStore返回的对象

很高兴有帮助,为任何问题写评论。如果有帮助,请记得投票并检查回复。 Byee