3

編集:解決済み、SOが許可したときに私の答えをマークします:)

私は greenDAO を使用して一連のクラスを生成していますが、GSON でそれらをシリアル化しようとすると、greenDAO によって生成されたフィールドの一部をシリアル化しようとしているようで (これは私には関係ありません)、クラッシュします。シリアライズしたいオブジェクトは、他の生成されたオブジェクトと生成されたオブジェクトのリストを参照しています。

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

私のおかげで:)

4

2 に答える 2

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 オブジェクトを返すために私が書いたメソッドです。

そして、それは次のように呼び出されます:

public String infoToJson(Info i)
{
    GsonBuilder gson = new GsonBuilder();
    gson.registerTypeAdapter(Info.class, new InfoSerializer());
    return gson.create().toJson(i);
}
于 2012-04-18T22:39:09.047 に答える
1

transient特定のフィールドのシリアル化を避けたいだけの場合は、キーワードでラベル付けできることを覚えておいてください。これは、Gson によってシリアル化されないことを意味します。

于 2012-04-18T22:44:28.107 に答える