序列化泛型类时动态更改属性

时间:2018-07-09 08:39:21

标签: android realm gson

我有以下通用类,我正在尝试使用Gson库进行序列化。

public class TRequest<T> implements RealmModel {


    private RealmList<T> requestList;

    public RealmList<T> getRequestList() {
        return requestList;
    }

    public void setRequestList(RealmList<T> requestList) {
        this.requestList = requestList;
    }
}

已编写以下代码对数据进行序列化

    //crate fitness object
    Fitness fitness = new Fitness();
    fitness.set_id("100");
    fitness.setIntensity("2300");

    //create realm list
    RealmList<Fitness> fitnessRealmList  = new RealmList<Fitness>();
    fitnessRealmList.add(fitness);

    //create tRequest object
    TRequest<Fitness> tRequest = new TRequest<Fitness>();
    tRequest.setRequestList(fitnessRealmList);


    GsonBuilder builder = new GsonBuilder();
    Gson gson = builder.create();


    //serialize it 
    String stringData = gson.toJson(tRequest);

结果是我得到以下输出

  

{“ requestList”:[{“ _ id”:“ 100”,“ intensity”:“ 2300”}]}

由于我的班级是通用的,我想将属性值动态从“ requestList”更改为“ fitness”。同样,如果我要序列化常规对象,则应将“ requestList”替换为“ routine”。

预期输出为

  

{“健身”:[{“ _ id”:“ 100”,“强度”:“ 2300”}]}

我尝试了如下类型的令牌,但是没有用

    Type type  = new  TypeToken<Fitness>(){}.getType();
    String stringData = gson.toJson(tRequest,type);

1 个答案:

答案 0 :(得分:1)

我将尝试按此处说明的方法使用自定义序列化程序:link

这里是一个例子:

public class TRequest<T> {

    private final String attributeName;
    private RealmList<T> requestList;

    public TRequest(String attributeName) {
        this.attributeName = attributeName;
    }

    public String getAttributeName() {
        return attributeName;
    }

    public RealmList<T> getRequestList() {
        return requestList;
    }

    public void setRequestList(RealmList<T> requestList) {
        this.requestList = requestList;
    }
}

public class MySerializer implements JsonSerializer<TRequest<?>> {

    @Override
    public JsonElement serialize(TRequest<?> t, Type type, JsonSerializationContext jsc) {
        JsonObject obj = new JsonObject();
        obj.add(t.getAttributeName(), jsc.serialize(t.getRequestList()));
        return obj;
    }

}

//when using it
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(TRequest.class, new MySerializer());
Gson gson = builder.create();
String toJson = gson.toJson(tRequest);