【问题标题】:change property dynamically while serializing generic class在序列化泛型类时动态更改属性
【发布时间】:2018-07-09 08:39:20
【问题描述】:

我有以下通用类,我正在尝试使用 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”替换为“例程”。

预期输出是

{"fitness":[{"_id":"100","intensity":"2300"}]}

我尝试了以下类型的令牌,但它不起作用

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

【问题讨论】:

    标签: android realm gson


    【解决方案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);
    

    【讨论】:

    • 你的回答太笼统了
    • 这种方法的问题是我们正在创建新的 jsonObject,因此 Request 类中的其他字段消失了
    • 你必须在MySerializerserialize方法中添加你想要序列化的所有字段
    • 它会降低与序列化相关的性能吗?
    • 我不这么认为,我认为它可以更快,因为获取字段信息所需的反射更少(序列化,不序列化等)
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多