【问题标题】:How can I specify serialisation with GSON?如何使用 GSON 指定序列化?
【发布时间】:2012-04-18 01:23:51
【问题描述】:

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

我正在使用 greenDAO 生成一堆类,当我尝试让 GSON 序列化它们时,它似乎试图序列化 greenDAO 生成的一些字段(我不感兴趣)和崩溃。我希望序列化的对象引用其他生成的对象和生成的对象列表。

GSON 说它允许由 toString() 方法描述的序列化,我尝试了不同的方法,但是当我检查文件的输出时,它只是显示为 toString() 方法。有人可以告诉我如何从 toString() 方法生成 JSON 对象,或者建议另一种方法来进行自定义序列化。

谢谢 :)

【问题讨论】:

    标签: java android json gson


    【解决方案1】:

    最后想通了 :) 原来我需要为我的每个对象实现一个 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);
    }
    

    【讨论】:

      【解决方案2】:

      如果您只是想避免序列化某些字段,请记住您可以使用 transient 关键字标记它们。这意味着它们不会被 Gson 序列化。

      【讨论】:

      • 问题是,如果(并且可能何时)我重新生成 greenDao 对象,我将不得不手动将 100 个良好的字段重新标记为瞬态。
      • 啊,真可惜。我有点惊讶 DAO 库会缺乏对瞬态字段的支持。
      • 主要问题是它生成了很多用于它自己的数据库映射和内部函数的字段,在生成类之前我无法编辑。
      • 我明白了。我很欣赏这些信息。 (我目前正在关注 SQLite 的 Java ORM,所以这很有帮助!)
      • GreenDAO 1.3.7 用瞬态标记 orm 特定字段。
      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多