【问题标题】:Deserialize List to unmodifiable collection with gson使用 gson 将列表反序列化为不可修改的集合
【发布时间】:2013-07-22 09:03:19
【问题描述】:

我希望将所有 Lists 反序列化为不可修改的集合。

这是我要反序列化的类:

public class MyClass
{
    public final mylist = Collections.unmodifiablelist(new ArrayList());
}

我如何反序列化:

MyClass inst = (new Gson()).fromJson("{mylist:[\"firstString\"]}", MyClass.class);

我不想为所有 100 个使用 List 的类创建一个类型适配器,所以有没有办法为 Gson 的实例全局覆盖 List 的可反序列化?

【问题讨论】:

  • mylist的字段类型在哪里?

标签: java list deserialization gson


【解决方案1】:

为什么不遵循 JavaBean 标准,只返回不可修改的列表?

public class MyClass {
    private List<String> myList = new ArrayList<String>();

    public void setMyList(List<String> list) {
        this.myList = list;
    }

    public Collection<String> getMyList() {
        return Collections.unmodifiablelist(this.myList);
    }
}

【讨论】:

  • ...因为myList 实例也在内部使用...出于理智的原因,我宁愿让它不可修改。
  • 恕我直言,如果您不能相信自己的班级不会进行修改,那么您就有更大的问题
  • ...这不是一个信任的事情...更多关于推理应该有人在以后编辑我的课程....如果它是不可修改的,它会让开发人员停下来思考为什么这样做...
【解决方案2】:

我也会使用适配器工厂,但代码更短:

class MyAdapter implements TypeAdapterFactory {

  @Override
  public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> tokenType) {
    final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, tokenType);

    return new TypeAdapter<T>() {
      @Override
      public void write(JsonWriter out, T value) throws IOException {
        delegate.write(out, value);
      }

      @Override
      public T read(JsonReader arg0) throws IOException {
        T t = delegate.read(arg0);
        if (List.class.isAssignableFrom(tokenType.getRawType())) {
          List<?> list = (List<?>) t;

          return (T) Collections.unmodifiableList(list);
        }

        return t;
      }
    };
  }
}

然后,像往常一样,注册它:

Gson g = new GsonBuilder().registerTypeAdapterFactory(new MyAdapter()).create();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多