【问题标题】:Should I reuse one instance of GSON or create new ones on demand?我应该重复使用一个 GSON 实例还是按需创建新实例?
【发布时间】:2015-07-15 14:07:31
【问题描述】:

在我的大部分课程(尤其是服务器资源)中,我倾向于按需创建com.google.gson.Gson 的新实例。有时我使用默认构造函数创建它们(用于处理简单的 POJO),有时我使用通过自定义 com.google.gson.GsonBuilder 创建的更复杂的变体。

我知道Gson 是一个线程安全类,所以没有什么反对重复使用Gson 的同一个实例而不是创建新实例。哎呀,我什至可以为此重用一个静态常量!

我的问题是:我应该在需要时创建新实例,还是应该只创建和使用一个?如果我使用 Gson 创建的 GsonBuilder 实例序列化简单 POJO 并教授如何解析更复杂的数据结构(注册的自定义序列化程序很少),我将面临什么样的性能影响?

【问题讨论】:

  • 我会在性能之前考虑正确性可读性。除非您有可靠的基准来证明 Gson 实例创建是一个瓶颈,在这种情况下,您可以牺牲一些可读性来换取性能。
  • @biziclop,我完全同意你的评论,但我不明白这个评论在这里是如何适用的。这纯粹是关于每次调用new Gson() 或用静态引用(如JsonUtils.GSON 或单例DefaultGson.instance())包装它。
  • 我稍微误读了您的问题,我以为您将缓存多个 Gson 对象,其中线程安全(正确性)将是一个因素。对不起。 (我不知道Gson 的任何详细信息,但在类似情况下,如果有帮助,我倾向于选择单实例解决方案。让事情变得更简单。)
  • Retrofit 在GsonConverterFactory 中使用了 Gson 的缓存版本,所以我倾向于认为这比每次都创建一个新版本要好。
  • 我实际上已经这样做了很长时间,而且我从未遇到任何问题。拥有一组固定的适配器/序列化器也很有帮助,如果您只有一个实例,则更容易维护。

标签: java json gson


【解决方案1】:

我知道这是一个老问题,但为了将来参考,这个问题的答案是,如果可能的话,你应该选择单一实例。

创建 GSON 对象的成本很高,具体取决于您向其注册了多少自定义反序列化器/序列化器/处理程序。我怀疑您是否会从中看到任何显着的性能提升。

关于第二个问题,GSON 内部有一个已注册序列化器的列表,并且每个序列化器都会根据您要解析的对象进行检查。因此,您基本上每次注册自定义序列化程序时都会添加更多迭代,但与将几个大而笨拙的对象放入内存相比,这并不是一个大的性能问题。

【讨论】:

  • 您的回答没有意义-“创作...很昂贵...我怀疑您会从中看到任何巨大的性能提升”。你好像在自相矛盾。同样在第 3 段的最后一行,它变得有点混乱。
  • 请阅读整句话:“很贵取决于多少……”。这意味着更多的对象=更昂贵。另外,我不明白最后一句话你不明白的地方。
  • 嗨,谢谢 - 我们看到或没有看到性能提升的原因是什么?最后一行说注册自定义序列化程序会增加更多迭代,与将对象保存在内存中相比,这不是一个大问题 - 所以你是说我们应该将对象保存在内存中吗?将其与您的第一行联系起来,即如果可能,我们应该使用单个实例 - 即使这可能意味着“内存中有几个大笨拙的对象”。
  • fwiw 我同意缓存 gson - 只是不要遵循答案中的逻辑。
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 2011-01-31
  • 2023-03-18
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多