2012-04-18 8 views
3

EDIT:解決しました。私が答えてくれました。答え:GSONでシリアル化を指定するにはどうすればよいですか?

greenDAOを使用してクラスを生成していますが、GSONをシリアル化しようとするとシリアル化しようとしていますgreenDAOによって生成されたフィールドのうちのいくつか(私にとって興味のないものです)とクラッシュします。シリアル化したいオブジェクトは、生成された他のオブジェクトと生成されたオブジェクトのリストを参照します。

GSONは、toString()メソッドで記述されたシリアライズを可能にしていますが、私はさまざまなアプローチを試みましたが、ファイルへの出力を調べるときにはtoString()メソッドとして現れます。誰かがtoString()メソッドからJSONオブジェクトを生成する方法を教えてください。あるいは、カスタムシリアル化を行う別の方法を提案してください。

私のおかげで:)

答えて

5

が最後にそれを考え出した:)私は私のオブジェクトごとにJsonSerializerを実装し、手動でシリアライズを指定する必要が判明。非常に面倒です!他のオブジェクトへの参照には、ネストが必要です。これは、toJsonTree()メソッドを使用して行いました。ここに私の最も読みやすいシリアライザ

private class InfoSerializer implements JsonSerializer<Info> 
{ 
    @Override 
    public JsonElement serialize(Info src, Type typeOfSrc, 
      JsonSerializationContext context) 
    { 
     JsonObject obj = new JsonObject(); 
     obj.addProperty("details", src.getDetails()); 
     obj.addProperty("hostId", src.getHostId()); 
     obj.addProperty("dateCreated", src.getDateCreated().toString()); 
     obj.addProperty("expiryDate", src.getExpiryDate().toString()); 
     obj.add("alternativeInfo", getGsonInstance().toJsonTree(src.getAlternativeInfo())); 
     obj.add("alternativeTimes", getGsonInstance().toJsonTree(src.getAlternativeTimes())); 
     return obj; 
    } 
} 

注意です:getGsonInstance()、私はシングルトンGsonオブジェクトを返すために書いた方法です。

そして、それは、次のように呼び出しますあなたはちょうどあなたがtransientキーワードでそれらにラベルを付けることができることを覚えて、特定のフィールドをシリアル化を回避しようとしている場合

public String infoToJson(Info i) 
{ 
    GsonBuilder gson = new GsonBuilder(); 
    gson.registerTypeAdapter(Info.class, new InfoSerializer()); 
    return gson.create().toJson(i); 
} 
1

。つまり、彼らはGsonによってシリアル化されません。

+2

問題は、私がgreenDaoオブジェクトを再生成した場合、手動で良い100個のフィールドを一時的に再ラベル付けする必要があるということです。 – Chironex

+0

ああ、バマー。私は、DAOライブラリが一時的なフィールドのサポートを欠いていると少し驚いています。 – Tom

+0

主な問題は、独自のデータベースマッピングとクラスが生成される前に編集できない内部関数のために使用される多くのフィールドを生成することです。 – Chironex

関連する問題