java - GSON/JSON 单例反序列化

标签 java json singleton deserialization gson

我有一个以下单例类:

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());    

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

最佳答案

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

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();

关于java - GSON/JSON 单例反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22746442/

相关文章:

swift - 从单例初始化程序中抛出异常

c# - 为每个用户创建不同的静态单例实例

java - 使用 hibernate.enable_lazy_load_no_trans 解决 Hibernate Lazy-Init 问题

java - 使用express在 Node 服务器上接收JSON对象

javascript - 从 Highstock/Highcharts 获取奇怪的错误信息

c# - JSON 反序列化为具有私有(private) setter 的对象

php - 静态方法 : are they still bad considering PHP 5. 3 后期静态绑定(bind)?

java - 如何在 Windows 10 的 Java Swing JButton 中获得白色背景

java - 让 JVM 使用我自己的类加载器

java - JAXP00010004 和 java.lang.OutOfMemoryError : GC overhead limit exceeded