2013-03-02 57 views
2

当我有这样GSON序列化豆

class Foo 
{ 
    private String Bar = "someBarValue"; 
} 

实体和下面的语句

String json = new Gson().toJson(new Foo()); 

结果{ "bar" : "someBarValue"}

我有很多类,按照标准的Java bean会议

class FooBean 
{ 
    String getBar() { return "someBarValue"; } 
} 

和下面的语句

String json = new Gson().toJson(new FooBean()); 

结果{}

我如何可以序列化(和最终反序列化,如果我有setter方法)FooBean使用GSON上面的例子中,而不必依赖于私有成员变量一堂课?

回答

4

这是不可能的,因为今天。看看Gson Design Document

使用字段VS干将,表示JSON中的元素

一些JSON库使用类型的getter方法来推断JSON中的元素。我们选择使用非瞬态,静态或合成的所有字段(继承层次结构)。我们这样做是因为并不是所有的类都使用适当命名的getter编写。而且,getXXX或isXXX可能是语义的,而不是指示属性。

但是,支持属性也有很好的参数。我们打算在后一版本中增强Gson以支持属性作为指示Json字段的替代映射。目前,Gson是以田野为基础的。

您可能会考虑的另一件事是序列化/反序列化的概念:为什么要序列化/反序列化一个对象?一般来说,要在持久性,通信(即主要是I/O)之后拥有它的副本。有意义的是不要依赖getters和setter来这样做。它们可能会改变对象的内容,因此序列化/反序列化不会实现它们的构建。

+0

现在我意识到这个话题在这里覆盖:http://stackoverflow.com/questions/6203487/why-does-gson-use-fields-and-not-getters-setters 所以,把信用给某人谁先回答。 – Viccari 2013-03-02 21:48:20