3

编辑:已解决,当我允许时将标记我的答案:)

我正在使用 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 回答