繁体   English   中英

可以将 Gson 实例用作模型 bean 中的静态字段(重用)吗?

[英]Is it OK to use Gson instance as a static field in a model bean (reuse)?

这是我实现的模型:

public class LoginSession {
    private static final Gson gson = new Gson();

    private String id;
    private String name;
    private long timestamp;

    public LoginSession(String id, String name) {
        this.id = id;
        this.name = name;
        this.timestamp = System.currentTimeMillis();
    }

    public String toJson() {
        return gson.toJson(this);
    }

    public static LoginSession fromJson(String json) {
        checkArgument(!isNullOrEmpty(json));
        return gson.fromJson(json, LoginSession.class);
    }
}

我认为为每个 LoginSession 实例创建新的 Gson 实例是没用的。

但我担心的是线程安全问题。 大约每秒将创建 1000 多个实例。

使用 Gson 实例作为静态字段可以吗?

感谢您的任何建议/更正。

对我来说似乎很好。 GSON 实例中没有任何内容使其与LoginSession的特定实例相关,因此它应该是静态的。

GSON 实例应该是线程安全的,并且有一个关于已修复的错误

核心Gson类是线程安全的。 我刚刚遇到了一个据称与 GSON 相关的线程安全问题。 使用自定义JsonDeserializerJsonSerializer进行Date解析和格式化时会出现此问题。 事实证明,线程安全问题在于我的方法使用了非线程安全的静态SimpleDateFormat实例。 一旦我将静态SimpleDateFormat包装在一个ThreadLocal实例中,一切都很好。

根据评论,现有的单元测试并没有真正测试多少,小心与线程安全相关的任何事情......

有一个检查线程安全的单元测试

/**
 * Tests for ensuring Gson thread-safety.
 *
 * @author Inderjeet Singh
 * @author Joel Leitch
 */
public class ConcurrencyTest extends TestCase {
  private Gson gson;
  ...

您可能想知道这个单元测试是否足以在每个可能的机器配置上找到所有可能的问题? 对此有何评论?

文档中也有这句话:

Gson 实例在调用 Json 操作时不维护任何状态。 因此,您可以自由地为多个 Json 序列化和反序列化操作重用同一个对象。

不久前我们遇到了线程安全问题,我们通过在 apache commons 中使用 FastDateFormat 解决了这个问题。

刚刚围绕这个为 Gist创建了一个 gist 链接,以帮助那些想知道 Gson 实例是否可以重用的人。 他们没有 setter 并且所有变量都是私有的。

所以除了 SimpleDateFormat 问题之外,我没有看到他们在其他任何地方维护状态。

请检查了。 这是我第一次回复其中一个。 乐于回馈一次。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM