2013-03-02 97 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