我应该重复使用一个GSON实例还是按需创建新的实例?

20
在我的大多数课程中(特别是服务器资源),我倾向于按需创建com.google.gson.Gson的新实例。有时我使用默认构造函数(用于处理简单的POJOs),有时我使用更复杂的变体,这些变体使用自定义的com.google.gson.GsonBuilder创建。
我知道Gson是一个线程安全的类,所以没有什么可以阻止我重复使用同一个Gson实例,而不是创建新的实例。甚至我可能会重用一个静态常量!
我的问题是:我应该在需要时创建新实例,还是应该创建并只使用一个实例?如果我使用一个已经使用GsonBuilder创建的Gson实例来序列化简单的POJO,则会面临什么样的性能影响,而且该实例还学会了如何解析更复杂的数据结构(注册了几个自定义序列化程序)?

在考虑性能之前,我会优先考虑正确性和可读性。除非您有可靠的基准测试证明Gson实例创建是瓶颈,否则您可以为了性能而牺牲一些可读性。 - biziclop
1
@biziclop,我完全同意您的评论,但我不明白这个评论与这里有什么关系。这纯粹是关于每次调用new Gson()或使用静态引用像JsonUtils.GSON或单例DefaultGson.instance()的包装。 - ŁukaszBachman
我稍微误读了你的问题,我以为你要缓存多个Gson对象,其中线程安全(正确性)将是一个因素。抱歉。(我不太了解Gson,但在类似的情况下,如果有帮助,我倾向于选择单个实例解决方案。这会使事情变得简单得多。) - biziclop
Retrofit在GsonConverterFactory中使用了缓存版本的Gson,因此我倾向于认为这比每次创建一个新的更好。 - Richard Le Mesurier
我实际上已经做了相当长的时间,而且从未遇到任何问题。如果您只有一个实例,则固定适配器/序列化程序集合也会帮助您更轻松地维护。 - ŁukaszBachman
1个回答

2

我知道这是一个老问题,但供以后参考,这个问题的答案是如果可能的话应该选择单个实例。

创建GSON对象是昂贵的,这取决于您注册到其中的自定义反序列化器/序列化器/处理程序的数量。我怀疑您不会从中看到任何大的性能提升。

关于第二个问题,GSON内部有一个已注册序列化器列表,每次对您正在尝试解析的对象进行检查。因此,每次注册自定义序列化器时,您基本上会增加更多迭代次数,但是与将几个大型笨拙的对象加载到内存中相比,这并不是一个大的性能问题。


4
你的回答没有意义 - "这个创建...是昂贵的...我怀疑你不会从中看到任何大的性能提升"。你似乎自相矛盾。另外,在第三段的最后一行,有点令人困惑。 - Richard Le Mesurier
"根据物品数量来定价是高昂的。这意味着更多的物品=更昂贵。同时,我不明白您对最后一句话有什么疑问。" - Aurasphere
嗨,谢谢 - 我们看到或没有看到性能提升来自于什么?最后一行说注册自定义序列化程序会增加更多迭代,与将对象保留在内存中相比并不是一个大问题 - 那么你是说我们应该将对象保留在内存中,还是不应该?将其与您的第一行联系起来,即使这可能意味着在内存中有“几个笨重的大对象”,我们也应该尽可能使用单个实例。 - Richard Le Mesurier
1
就我而言,我同意缓存Gson - 只是不明白答案中的逻辑。 - Richard Le Mesurier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接