我有以下User.class (仅举一个例子):
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);
}
}我就是这样拯救用户的:
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();输出文件如下所示:
{
"test_user_3": {
"id": 3,
"username": "TestUser3"
},
"test_user_1": {
"id": 213,
"username": "TestUser1"
},
"test_user_2": {
"id": 999,
"username": "TestUser2"
}
}我所期望的:
{
"test_user_3": "3_TestUser3",
"test_user_1": "213_TestUser1",
"test_user_2": "999_TestUser2"
}如果我让Gson忽略id和username (transient或通过@Expose特性),结果就是这样:
{
"test_user_3": {},
"test_user_1": {},
"test_user_2": {}
}因此,我的问题是:如何使Gson使用我已重写的Externalizable方法?GsonBuilder().registerTypeAdapter()是用于这个的吗?
发布于 2016-01-30 16:23:25
你不能,但你可以写一个自定义用户序列化程序
public class UserSerializer implements JsonSerializer<User> {
@Override
public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.id + "_" + src.username);
}
}并将Gson实例配置为对用户类型使用序列化程序:
Gson gson = new GsonBuilder()
.registerTypeAdapter(User.class, new UserSerializer())
.create();https://stackoverflow.com/questions/35103821
复制相似问题