我有一个标有瞬态字段的POJO。 GSON没有将其序列化。大。但是当它被反序列化时,它会消除该字段的初始设置。
例如,如果我有这个对象:
public class ObjWithTransient {
public String name;
public transient List<String> listOStrings = new ArrayList();
}
我进行了这个测试:
@Test
public void testSerializeWithTransient() throws Exception {
ObjWithTransient obj = new ObjWithTransient();
obj.name = "Foobar";
String json = gson().toJson(obj);
// Deserialize
ObjWithTransient obj2 = GsonUtil.gson().fromJson(json, ObjWithTransient.class);
Assert.assertEquals(obj2.name, "Foobar");
Assert.assertNotNull(obj2.listOStrings); // <--- Fails here
Assert.assertEquals(obj2.listOStrings.size(), 0);
}
通过标记它是暂时的,我假设我告诉GSON忽略它,但似乎并非如此。保留初始设置的最佳方法是什么?
编辑: 我认为问题是因为没有声明的构造函数。这不适用于内部类,但是使用普通类或静态内部类似乎可以工作。阅读GSON代码,它尝试了多种创建对象的方法,但最终使用UnsafeConstructor来创建它,如果没有其他工作。这将创建一个具有全部空条目的对象。我还可以添加一个InstanceCreator来告诉Gson如何创建对象。
答案 0 :(得分:1)
我认为问题是因为没有声明的构造函数。这不适用于内部类,但是使用普通类或静态内部类似乎可以工作。阅读GSON代码,它尝试了多种创建对象的方法,但最终使用UnsafeConstructor来创建它,如果没有其他工作。这将创建一个具有全部空条目的对象。我还可以添加一个InstanceCreator来告诉Gson如何创建对象。