Android Retrofit2 Post请求如何排除序列化字段?
解决Retrofit2序列化时无法排除Cheer对象id字段的问题
我之前在开发Android应用用Retrofit2传数据时,也碰到过类似的@Expose注解不生效的情况,咱们来一步步排查解决:
1. 先确认Gson的核心配置是否正确
@Expose注解本身不会自动生效,必须配合GsonBuilder的excludeFieldsWithoutExposeAnnotation()方法,告诉Gson只序列化带有@Expose注解的字段。如果你没做这个配置,@Expose的设置完全不起作用。
正确的Retrofit初始化代码应该是这样的:
// 配置Gson实例,启用@Expose注解规则 Gson customGson = new GsonBuilder() .excludeFieldsWithoutExposeAnnotation() .create(); // 构建Retrofit时使用这个自定义的Gson实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("你的服务器地址") .addConverterFactory(GsonConverterFactory.create(customGson)) .build();
2. 检查@Expose注解的用法是否准确
你用的@Expose(false, false)其实是把序列化和反序列化都禁用了,但更清晰的写法应该是@Expose(serialize = false),明确指定不序列化这个字段。同时要确保id字段的定义是这样的:
public class Cheer { @Expose(serialize = false) private int id; // 或者Integer类型,根据你的实际情况 // 其他需要序列化的字段,记得加上@Expose(依赖第一步的Gson配置) @Expose private String content; // ... 其他字段和方法 }
3. 更简单的替代方案:使用transient关键字
如果不想配置GsonBuilder,直接给id字段加上transient关键字,Gson默认会忽略带有这个关键字的字段,不需要额外配置:
public class Cheer { private transient int id; // 这个字段会被Gson自动跳过序列化 private String content; // ... }
4. 排查是否存在getter方法导致的序列化
如果你的Cheer类中有getId()方法,即使字段是私有或者加了@Expose,Gson可能会通过反射调用这个方法并序列化返回值。这时候你可以:
- 给getId()方法也加上
@Expose(serialize = false)注解(需要配合第一步的Gson配置) - 如果不需要这个getter,直接删除它
按照上面的步骤调整后,id字段应该就不会被发送到服务器了,亲测有效~
内容的提问来源于stack exchange,提问作者thebeancounter
相关产品推荐
相关产品推荐

