Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向字段添加冗余的@JsonProperty值注释是否会提高反序列化性能?_Java_Json_Serialization_Reflection_Jackson - Fatal编程技术网

Java 向字段添加冗余的@JsonProperty值注释是否会提高反序列化性能?

Java 向字段添加冗余的@JsonProperty值注释是否会提高反序列化性能?,java,json,serialization,reflection,jackson,Java,Json,Serialization,Reflection,Jackson,我使用Jackson(2.6.0)将JSON请求反序列化为简单的POJO。我已经在我的POJO中实现了所有setter方法来微调分配。JSON中的一些字段名相当神秘,例如seq。我想将我的java类字段命名为layoutsequence 我知道要做到这一点,我只需要将我的字段注释为: @JsonProperty("seq") private int layoutSequence; 我的问题是,对于我不需要重命名的JSON字段,例如title,将其注释为以下内容是否有最低的性能优势: @Json

我使用Jackson(2.6.0)将JSON请求反序列化为简单的POJO。我已经在我的POJO中实现了所有setter方法来微调分配。JSON中的一些字段名相当神秘,例如
seq
。我想将我的java类字段命名为
layoutsequence

我知道要做到这一点,我只需要将我的字段注释为:

@JsonProperty("seq")
private int layoutSequence;
我的问题是,对于我不需要重命名的JSON字段,例如
title
,将其注释为以下内容是否有最低的性能优势:

@JsonProperty("title")
private String title;
我的问题源于我对杰克逊在幕后工作的理解。我假设Jackson使用反射来内省地检查我的POJO,并确定它试图从JSON值分配的当前字段。使用这种方法,我假设它必须进行一些搜索才能找到匹配项,这会带来一些开销


如果我直接指定字段名,Jackson是否会盲目地尝试使用与我在注释中标识的字段名模式(
setTitle()
)匹配的setter初始化我的字段?或者它仍然执行内部类搜索来验证方法的存在吗?

不,它不应该提高性能。内省只执行一次,以构建
JsonDeserializer
,而不会在初始时间之后执行。 注释内省(甚至只是一般字段、方法内省)是一项非常昂贵的操作,因此序列化程序/反序列化程序被积极地缓存,以避免重复执行

需要重复查找的唯一情况是在构造新的
对象映射器时,即在不重用/共享少量映射器(理想情况下是一个映射器)时。

ObjectReader
s的不同之处在于,它们的开销非常小,因为它们与创建它们的
ObjectMapper
共享缓存的反序列化程序,因此不需要重用它们。但是映射器需要重复使用。

这对您来说应该是非常简单的尝试。我猜这不会为您节省很多时间,因为注释查找可能与字段查找具有相似的成本;我没有意识到这种缓存形式,认为它很有意义。你能提供更多关于这个主题的信息吗(我做了搜索,没有看到任何真正相关的东西)?那么“缓存”现在到底包含什么?我想我的问题还不止于此。如果指定了“key”(在本例中是要分配的字段名),这难道不会比搜索“value”(缓存字段)以匹配JSON字段名更快吗?有关更多信息,请加入jackson用户或开发人员列表。但从本质上讲,序列化程序和反序列化程序在第一次需要时,是根据它们用来处理的类型进行缓存的。映射器将为“根值”(直接给定的值)找到所需的一个映射器;序列化器/反序列化器的构造通常也会触发递归调用。其中一些调用将发现已构造序列化程序/反序列化程序。Bean(反)序列化程序也急切地解析属性ser/deser。