据我所知,使用 Gson,您有几个选择。
1.使用瞬态
如果你用@Transient(Java 中的transient)标记一个字段,这将从序列化中排除:
data class Foo(
@Transient val a: Int,
val b: Int)
这里,b 将被序列化,a 不会。
这有一个巨大的缺点——java中的几乎每个框架都考虑@Transient,有时你不希望它被Gson序列化,但你可能希望将它持久化到数据库中(如果你会为两者使用相同的类)。为了解决这个问题,还有另一种选择,使用 @Expose。
2。使用暴露
您需要使用构建器创建gson 实例:
val gson = GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
现在,没有@Expose 的字段将不会被序列化:
data class Foo(
val a: Int,
@Expose val b: Int)
同样,a 不会被序列化,但 b 会。
3.使用排除策略
更高级的方法是使用排除策略。这允许对字段进行大量自省。从自定义注释到字段名称或类型。
同样,您需要使用构建器创建gson:
val gson = GsonBuilder()
.addSerializationExclusionStrategy(strategyInstance)
.create();
然后你定义一个策略,比如:
object : ExclusionStrategy() {
override fun shouldSkipField(field: FieldAttributes): Boolean {
}
override fun shouldSkipClass(clazz: Class<*>): Boolean {
}
}
在shouldSkipField 中,当您不想序列化该字段时返回true,而当您想要序列化该字段时返回false。因为它接收一个FieldAttributes,所以你可以从字段中获取很多属性,例如名称和注释。这允许非常细粒度的控制。
最后,您也可以为反序列化设置此策略,也可以为 addDeserializationExclusionStrategy 和 setExclusionStrategies 设置此策略。