为了账号安全,请及时绑定邮箱和手机立即绑定

使用TypeAdapter为对象中的一个变量(多个变量)提供Gson自定义Seralizer

使用TypeAdapter为对象中的一个变量(多个变量)提供Gson自定义Seralizer

HUX布斯 2019-12-10 10:26:12
我已经看到了许多使用自定义TypeAdapter的简单示例。最有用的是Class TypeAdapter<T>。但这还没有回答我的问题。我想自定义对象中单个字段的序列化,并让默认的Gson机制负责其余的工作。出于讨论目的,我们可以使用此类定义作为我要序列化的对象的类。我想让Gson序列化基类的前两个类成员以及所有公开的成员,并且我想为如下所示的第3个和最后一个类成员进行自定义序列化。public class MyClass extends SomeClass {@Expose private HashMap<String, MyObject1> lists;@Expose private HashMap<String, MyObject2> sources;private LinkedHashMap<String, SomeClass> customSerializeThis;    [snip]}
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

猜猜看,这很容易!


如果您实现JsonSerializer并JsonDeserializer针对您的类型,则可以用很少的代码处理所需的部分并将其委托给Gson进行其他所有操作:


在这种情况下,最好使用a JsonSerializer而不是a TypeAdapter,原因很简单,因为序列化程序可以访问其序列化上下文。


public class PairSerializer implements JsonSerializer<Pair> {

    @Override

    public JsonElement serialize(final Pair value, final Type type,

            final JsonSerializationContext context) {

        final JsonObject jsonObj = new JsonObject();

        jsonObj.add("first", context.serialize(value.getFirst()));

        jsonObj.add("second", context.serialize(value.getSecond()));

        return jsonObj;

    }

}

这样做的主要优点(除了避免复杂的解决方法)是,您仍然可以利用可能已在主上下文中注册的其他类型的适配器和自定义序列化程序。请注意,序列化程序和适配器的注册使用完全相同的代码。


但是,我将承认,如果您经常要修改Java对象中的字段,那么Jesse的方法看起来会更好。选择易用性与灵活性之间的权衡。


查看完整回答
反对 回复 2019-12-10
  • 3 回答
  • 0 关注
  • 785 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信