首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Gson使用Externalizable?

如何使Gson使用Externalizable?
EN

Stack Overflow用户
提问于 2016-01-30 15:58:57
回答 1查看 65关注 0票数 0

我有以下User.class (仅举一个例子):

代码语言:javascript
复制
public class User implements Externalizable {

    int id;
    String username;
    public User(String username, int id) {
        this.username = username;
        this.id = id;
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {}

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(id +"_" + username);
    }

}

我就是这样拯救用户的:

代码语言:javascript
复制
 Gson testson = new GsonBuilder().setPrettyPrinting().create();
 FileWriter writer = new FileWriter(file);
 Map<String, User> userStorage = new HashMap<>();
 userStorage.put("test_user_1", new User("TestUser1", 213));
 userStorage.put("test_user_2", new User("TestUser2", 999));
 userStorage.put("test_user_3", new User("TestUser3", 3));
 writer.write(testson.toJson(userStorage));
 writer.close();

输出文件如下所示:

代码语言:javascript
复制
{
  "test_user_3": {
    "id": 3,
    "username": "TestUser3"
  },
  "test_user_1": {
    "id": 213,
    "username": "TestUser1"
  },
  "test_user_2": {
    "id": 999,
    "username": "TestUser2"
  }
}

我所期望的:

代码语言:javascript
复制
{
  "test_user_3": "3_TestUser3",
  "test_user_1": "213_TestUser1",
  "test_user_2": "999_TestUser2"
}

如果我让Gson忽略idusername (transient或通过@Expose特性),结果就是这样:

代码语言:javascript
复制
{
  "test_user_3": {},
  "test_user_1": {},
  "test_user_2": {}
}

因此,我的问题是:如何使Gson使用我已重写的Externalizable方法?GsonBuilder().registerTypeAdapter()是用于这个的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-30 16:23:25

你不能,但你可以写一个自定义用户序列化程序

代码语言:javascript
复制
public class UserSerializer implements JsonSerializer<User> {
    @Override
    public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.id + "_" + src.username);
    }
}

并将Gson实例配置为对用户类型使用序列化程序:

代码语言:javascript
复制
Gson gson = new GsonBuilder()
        .registerTypeAdapter(User.class, new UserSerializer())
        .create();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35103821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档