3

2つのデータベースを同期するレプリケーションメカニズムを実行します。データベース間で通信するために、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..
}

Articleをシリアル化すると、その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"}

ジャクソンでは、Articleクラスを次のように変更します。

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);

動作しない。ブランドを逆シリアル化すると、ブランドのデシリアライザーがUUID文字列を返そうとしてキックインするようになりますが、代わりにデシリアライザーがブランドオブジェクトを返すようにしたいという問題があると思います。

2つの異なるGsonオブジェクトの作成を回避する方法はありますか?2つの異なるGsonオブジェクトの問題は、ArticleとBrandの両方を含むオブジェクトを逆シリアル化する場合です。

4

1 に答える 1

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そこに含まれるフィールドにそれらが使用されます。

于 2013-03-10T19:06:12.597 に答える