【问题标题】:GSON/JSON Deserialize of a singleton单例的 GSON/JSON 反序列化
【发布时间】:2014-03-30 16:21:34
【问题描述】:

我有以下单例类:

public class AuthenticatedUser extends User {

    private volatile static AuthenticatedUser instance;

    public static AuthenticatedUser getInstance() {
        if (instance == null) {
                synchronized (AuthenticatedUser.class) {
                    instance = new AuthenticatedUser();
                }
        }
        return instance;
    }

    private AuthenticatedUser() {

    }
}

我反序列化如下:

Reader reader = new InputStreamReader(entity.getContent());

User user = new Gson().fromJson(reader, User.class);
AuthenticatedUser aus = AuthenticatedUser.getInstance();
aus.setId(user.getId());
aus.setUsername(user.getUsername());
aus.setPassword(user.getPassword());
aus.setEmail(user.getPassword());
aus.setFullName(user.getFullName());    

我的问题:如何将其直接反序列化为单例?

【问题讨论】:

  • 什么意思?您正在反序列化为单例。
  • 好吧,如果我将 User.class 更改为 AuthenticatUser.class 它不会创建实例,如何解决?只需将 instance = this 或 instance = getInstance() 放入私有构造函数中即可?
  • 我想你已经偶然发现singletons are evil...的确切原因...
  • 好吧,我觉得这讲的有点过头了。好吧,我只需要将 User 实例存储在我的应用程序中,这样我就可以在需要时从多个地方访问它,所以 Singleton 是我找到的唯一选择。将不得不重新考虑这一点。

标签: java json singleton deserialization gson


【解决方案1】:

由于 Gson 使用反射 - 它忽略了在编译时检查的私有/公共指令,因此它可以创建一个新对象。但是,如果您希望此对象成为您的单例实例,则需要手动设置它。 这是一个例子:

Gson gson = new Gson();

// Serializing
AuthenticatedUser user = AuthenticatedUser.getInstance();
user.setUsername("me");
String json = gson.toJson(user);

// Desesializing
AuthenticatedUser user2 = gson.fromJson(json, AuthenticatedUser.class);
user2.setInstance(); // this is important!
String username = AuthenticatedUser.getInstance().getUsername();

【讨论】:

    猜你喜欢
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多