向字段添加冗余的@JsonProperty 值注释是否会提高反序列化性能?
Does adding redundant @JsonProperty value annotations to fields increase deserialization performance?
我正在使用 Jackson (2.6.0) 将 JSON 请求反序列化为简单的 POJO。我已经在我的 POJO 中实现了所有 setter 方法来微调分配。 JSON中的一些字段名比较隐晦,比如seq
。我想将我的 java class 字段命名为 layoutSequnce
.
我知道要这样做我只需要将我的字段注释为:
@JsonProperty("seq")
private int layoutSequence;
我的问题是 JSON 我不需要重命名的字段,例如 title
,无论如何将其注释为:
是否有任何最小的性能优势
@JsonProperty("title")
private String title;
我的问题源于我对杰克逊在幕后工作方式的理解。我假设 Jackson 使用反射来内省地检查我的 POJO 并确定它试图从 JSON 值分配的当前字段。使用这种方法,我假设它必须进行一些搜索才能找到匹配项,这会产生一些开销。
如果我直接指定字段名称,Jackson 是否会盲目地尝试使用与字段名称模式匹配的 setter 来初始化我的字段(本例中为 setTitle()
)?在注释中标识?或者它是否仍然执行内部 class 搜索来验证该方法的存在?
不,它不应该提高性能。内省只进行一次,以构建 JsonDeserializer
,并且不会在此初始时间之后。
注释自省(或者甚至只是一般字段、方法自省)是相当昂贵的操作,因此 serializers/deserializers 被积极缓存以避免多次执行。
唯一需要重复查找的情况是在构建新的 ObjectMapper
时,也就是说,当不是 reusing/sharing 少量(最好是一个)映射器时。
ObjectReader
的不同之处在于开销非常小,因为它们与创建它们的 ObjectMapper
共享缓存反序列化器,因此无需重用它们。但是映射器需要重复使用。
我正在使用 Jackson (2.6.0) 将 JSON 请求反序列化为简单的 POJO。我已经在我的 POJO 中实现了所有 setter 方法来微调分配。 JSON中的一些字段名比较隐晦,比如seq
。我想将我的 java class 字段命名为 layoutSequnce
.
我知道要这样做我只需要将我的字段注释为:
@JsonProperty("seq")
private int layoutSequence;
我的问题是 JSON 我不需要重命名的字段,例如 title
,无论如何将其注释为:
@JsonProperty("title")
private String title;
我的问题源于我对杰克逊在幕后工作方式的理解。我假设 Jackson 使用反射来内省地检查我的 POJO 并确定它试图从 JSON 值分配的当前字段。使用这种方法,我假设它必须进行一些搜索才能找到匹配项,这会产生一些开销。
如果我直接指定字段名称,Jackson 是否会盲目地尝试使用与字段名称模式匹配的 setter 来初始化我的字段(本例中为 setTitle()
)?在注释中标识?或者它是否仍然执行内部 class 搜索来验证该方法的存在?
不,它不应该提高性能。内省只进行一次,以构建 JsonDeserializer
,并且不会在此初始时间之后。
注释自省(或者甚至只是一般字段、方法自省)是相当昂贵的操作,因此 serializers/deserializers 被积极缓存以避免多次执行。
唯一需要重复查找的情况是在构建新的 ObjectMapper
时,也就是说,当不是 reusing/sharing 少量(最好是一个)映射器时。
ObjectReader
的不同之处在于开销非常小,因为它们与创建它们的 ObjectMapper
共享缓存反序列化器,因此无需重用它们。但是映射器需要重复使用。