【问题标题】:GSON Deserializing transients as nullGSON 将瞬变反序列化为空
【发布时间】:2015-07-03 00:37:51
【问题描述】:

我有一个 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 如何创建对象。

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    我认为问题在于没有声明的构造函数。这不适用于内部类,但对于普通类或静态内部类,它似乎可以工作。阅读 GSON 代码,它尝试了多种方法来创建对象,但如果没有其他方法,最终会使用 UnsafeConstructor 来创建它。这将创建一个包含空条目的对象。我还可以添加一个 InstanceCreator 来告诉 Gson 如何创建对象。

    【讨论】:

      猜你喜欢
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多