即使将字段设置为不使用Expose进行序列化,仍会调用Gson TypeAdapter的写入方法

时间:2015-09-09 00:23:06

标签: java gson

问题

@JsonAdapter(WatusiTypeAdapter.class)
@Expose(serialize = false, deserialize = true)
private Watusi watusi;

如果存在TypeAdapter,则Expose注释似乎会被忽略。仍然会调用write的{​​{1}}方法,但WatusiTypeAdapter表示它不应该被调用。也许这个想法是你应该将该决定委托给@Expose(serialize = true),但这使得类型适配器更不可重复使用。

问题

这是预期的行为还是错误?

1 个答案:

答案 0 :(得分:3)

javadoc of @Expose

  

除非您构建com.google.gson.Gson,否则此注释无效   使用com.google.gson.GsonBuilder并调用   com.google.gson.GsonBuilder.excludeFieldsWithoutExposeAnnotation()   方法

以此为例

public class Example {
    public static void main(String[] args) {
        Example example = new Example();
        example.other = new Other();

        Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
        System.out.println(gson.toJson(example));
    }

    @JsonAdapter(value = OtherAdapter.class)
    @Expose(serialize = true)
    private Other other;
}

class Other {
}

class OtherAdapter extends TypeAdapter<Other> {

    @Override
    public void write(JsonWriter out, Other value) throws IOException {
        System.out.println("hey");
        out.endObject();
    }

    @Override
    public Other read(JsonReader in) throws IOException {
        // TODO Auto-generated method stub
        return null;
    }
}

这将产生

{} 

换句话说,write未被调用。

这意味着您要公开的所有字段都必须使用@Expose进行注释。