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

这是我要反序列化的班级:

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


我如何反序列化:

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


我不想为所有使用List的所有100个类创建一个注册类型适配器的寄存器,因此是否有办法全局覆盖该List实例的Gson可反序列化?

最佳答案

我也会选择适配器工厂,但是代码较短:

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();

08-05 01:17
查看更多