当前位置: 首页 > 知识库问答 >
问题:

使用GSON在自定义类中添加序列化方法

佴波鸿
2023-03-14

我正在使用谷歌Gson将Java对象序列化到JSON中。现在,我正在使用寄存器TypeAdapter方法为一些类添加自定义序列化。通过使用这个,我需要将我想要序列化的所有类导入到我的项目中。

由于我正在处理一个项目,其中一个对象可以附加自定义类,所以我正在寻找一个解决方案,在这个解决方案中,我创建一个特定的方法(例如,toJson),并告诉Gson在以默认模式序列化之前搜索该方法。

public class Banana {

    ...

    public JsonObject toJson() {
        // do stuff here
    }
}

当Gson发现这个方法存在时,它会使用它,否则它会继续使用默认的序列化。

这是正确的方法吗?是否有其他方法将序列化代码包含到类中?

共有1个答案

佟阳焱
2023-03-14

我认为你应该使用TypeAdapterFactory

让具有自定义序列化的类实现一些接口,如:

interface CustomSerializable {
    JsonObject toJson();
}

然后执行如下操作:

public class CustomTypeAdapterFactory implements TypeAdapterFactory {
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        // if given type implements CustomSerializable return your TypeAdapter 
        // that is designed to use above mentioned interface
        // so it uses method toJson() appropriately
       
        // else return null for default serialization   
        return null;
    }
}

然后只需注册一次定制工厂,例如:

Gson gson = new GsonBuilder()
    .registerTypeAdapterFactory(new CustomTypeAdapterFactory())
    .create();

如果你不能改变类来实现CustomSerializable,你也可以使用反射来确定inf,有一个方法toJson(),但是如果有这样的方法,并且不是你添加的,那么它可能会产生严重的副作用。

 类似资料:
  • 也许我跑错了方向,但我有一个元素列表,我想读。 我有一个抽象基类,让我们称之为: 现在我有两个可能的实现:

  • 问题内容: 遵循在使用GSON解析JSON时使用枚举中的建议,我正在尝试序列化其键是使用Gson 的映射。 考虑以下类别: 两个问题: 为什么打印而不是? 我该如何打印? 问题答案: Gson对密钥使用了专用的序列化器。默认情况下,它使用将要用作键的对象的。对于类型,基本上就是常量的名称。,默认为类型,仅当将序列化为JSON值(对名称除外)时才使用。 使用来构建你的实例。

  • 我有一个不能用Gson正确序列化的类(类只是name和HashMap),所以我编写了一个自定义序列化程序来从HashMap中打印名称和键值对。 此外,这是实际打印的内容,序列化整个对象并不像我所期望的那样工作,也不只是直接打印对象。 任何帮助都将不胜感激。

  • 问题内容: 我在使用Gson解析JSON响应时遇到问题。 JSON字串: 我有这两个课程: 但是当使用Gson解析这个时我有一个异常。我知道这是因为响应数组的第一个元素不是对象,而是整数。 所以问题是,我能以某种方式解决它吗? 问题答案: 您必须编写一个 自定义反序列化器 。我会做这样的事情: 首先,您需要包括一个新的类,而不是已有的两个类: 然后,您需要一个自定义解串器,类似于以下内容: 然后,

  • 问题内容: gson是一个很棒的图书馆-运作良好。有时我有自定义要求,并且可以制作和注册TypeAdapters和TypeAdaptorFactories-效果也很好。 但是令我困惑的是如何委托回json序列化…大多数时候,我需要使用它进行收集,但为了说明这一点- 假设我有一个配对类,gson显然会很高兴地序列化,但是出于某种原因我需要自己的自定义序列化程序。好吧…如果我是 如果我为此编写了一个类

  • 然而,让我困惑的是,如何将委托返回到json序列化中...大多数时候,我需要这个集合,但为了说明这一点-假设我有一个pair类,gson显然会很高兴地序列化它,但出于某种原因,我需要自己的自定义序列化器。嗯...如果我的双是 如果我为此编写了一个类型适配器-您将希望write函数看起来如下所示: 所以你可以看到问题--我不知道第一个和第二个的类型,也不知道它们是如何序列化的。我可以使用gson.t