2013-03-10 23 views
3

我做一個複製機制,我同步兩個數據庫。爲了在數據庫之間進行通信,我使用Gson將對象序列化爲JSON。每個對象都有一個UUID來標識它。爲了避免必須發送最新的項目,當對象包含在要複製的對象的字段中時,我使用對象UUID。僅在字段上使用自定義解串器?

我們得到了以下類:

public class Entity { 
    String uuid; 

// Getters and setters.. 
} 

public class Article extends Entity { 
    String name; 
    Brand brand; 

// Getters and setters.. 
} 

public class Brand extens Entity { 
    String name; 
    Producer producer 

// Getters and setters.. 
} 

public class Producer extends Entity { 
    String name; 

// Getters and setters.. 
} 

如果我連載文章JSON表示將看起來像這樣:

{"brand":"BrandÖ179d7798-aa63-4dd2-8ff6-885534f99e77","uuid":"5dbce9aa-4129-41b6-a8e5-d3c030279e82","name":"Sun-Maid"} 

其中 「BrandÖ179d7798-aa63-4dd2-8ff6-885534f99e77」 是班級(「品牌」)和UUID。

如果我序列品牌我想到:

{"producer":"ProducerÖ173d7798-aa63-4dd2-8ff6-885534f84732","uuid":"5dbce9aa-4129-41b6-a8e5-d3c0302w34w2","name":"Carro"} 

在傑克遜我會改變文章類:

public class Article { 
    String uuid; 
String name; 
    @JsonDeserialize (using = EntityUUIDDeserializer.class) @ JsonSerialize (using = EntityUUIDSerializer.class)   
    Brand brand; 

// Getters and setters.. 
} 

,並實現自定義的串行器和解串返回UUID,而不是對象。

Gson沒有@JsonDeserialize註釋。

如果我們安裝串行器和解串做這樣的:

Gson gson = new GsonBuilder() 
      .registerTypeAdapter(Producer.class, new EntityUUIDDeserializer()) 
      .registerTypeAdapter(Brand.class, new EntityUUIDDeserializer()) 
      .registerTypeAdapter/Producer.class, new EntityUUIDSerializer()) 
      .registerTypeAdapter(Brand.class, new EntityUUIDSerializer())     
      .create(); 

我們可以連載文章和品牌確定。通過

Article article= gson.fromJson(inputJSONString, Article.class); 

反序列化第二十工作正常,但

Brand brand= gson.fromJson(inputJSONString, Brand.class); 

不起作用。我猜測是,當我們反序列化一個品牌時,我們得到了Brand的反序列化器,試圖返回一個UUID字符串,但我們希望反序列化器返回一個品牌對象。

有沒有辦法避免創建兩個不同的Gson對象?兩個不同的Gson對象的問題是,當你想要反序列化包含Article和Brand的對象時。

回答

1

您編寫串行器/解串器並使用Gson註冊它(使用GsonBuilder)。

https://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserialization

Gson g = new GsonBuilder() 
       .registerTypeAdapter(Producer.class, new MyProducerDeserializer()) 
       .registerTypeAdapter(Producer.class, new MyProducerSerializer())     
       .create(); 

當你序列化/反序列化Brand類,它會使用它們其中包含的Producer領域。

+0

如果我們僅序列化包含實體的實體,則您的解決方案可以正常工作。但是,如果我們有一個包含Brand對象的Article對象,它將不起作用。我們有任何解決方案的用例? 對不起,我的可憐的代碼示例導致你錯過了。 – 2013-03-12 13:54:38

+0

爲什麼它不工作?您爲特定的類註冊一個序列化器/反序列化器。遇到該類時,就會使用它們。在你編輯的案例中,你會註冊他們的品牌。class'。這與你在傑克遜使用的註釋類似,只是它在全球範圍內。 – 2013-03-12 15:05:37

+0

你的權利又一次,我再次解釋這個問題不好。請看看我的問題的變化。 – 2013-03-12 19:35:53