Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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 具有延迟序列化的Jackson值转换_Java_Jackson - Fatal编程技术网

Java 具有延迟序列化的Jackson值转换

Java 具有延迟序列化的Jackson值转换,java,jackson,Java,Jackson,我想用一种语言将一种Java类型转换成另一种。源对象为特定类型,但目标类型不同。出于性能原因,我希望避免序列化任何未在目标类型上定义的源字段。我知道反序列化可以配置为忽略额外的字段,但据我所知,所有源字段仍将在中间序列化中求值。有没有办法创建一个序列化程序,该序列化程序只计算目标类型上存在的字段 更一般地说,在Java类型之间转换时,是否可以使用目标类型的架构来确定源类型的序列化策略?否。正如您所说,您可以使反序列化程序部分忽略它无法识别的属性,但没有修剪序列化内容的功能 但您确定这是一个实际的

我想用一种语言将一种Java类型转换成另一种。源对象为特定类型,但目标类型不同。出于性能原因,我希望避免序列化任何未在目标类型上定义的源字段。我知道反序列化可以配置为忽略额外的字段,但据我所知,所有源字段仍将在中间序列化中求值。有没有办法创建一个序列化程序,该序列化程序只计算目标类型上存在的字段


更一般地说,在Java类型之间转换时,是否可以使用目标类型的架构来确定源类型的序列化策略?

否。正如您所说,您可以使反序列化程序部分忽略它无法识别的属性,但没有修剪序列化内容的功能


但您确定这是一个实际的性能问题吗?使用的中间形式(
TokenBuffer
)是一个简单的叶值序列,由于
String
s已经存在,开销应该相当低。不管怎样,都不涉及JSON的完全序列化。

您可以为
对象获得
BeanSerializer
,如下所示:

ObjectMapper m = new ObjectMapper ();
SerializerFactory f = m.getSerializerFactory ();
JsonSerializer <?> j = f.createSerializer (m.getSerializerProviderInstance (), object.getClass ())

显然,您可以在编写器上延迟调用
get()
,只要您愿意。这有点不对劲,但我还没有找到更好的解决方案。

看一看,您可以添加自定义序列化程序。@user1929959我知道您可以进行自定义序列化。我想弄清楚的是如何使其适应值转换中的目标类型。也许您可以考虑使用,您必须将convertValue更改为两步序列化,然后反序列化。@shmosel刚才我发现了另一个相关问题。可能有用吗?@roby这需要我提前知道哪些字段要序列化。在我的例子中,它将取决于特定转换的目标类型。我关心的不是实际的序列化。我正在使用自定义序列化,这会为每个字段查找带来额外的开销。(即使没有自定义序列化,也可能存在调用代价高昂的源方法
getFoo()
)。您可以尝试使用动态JSON过滤器,甚至JSON视图。这两种方法都可以在每次调用的基础上进行更改,并且它们也将应用于
convertValue()
,因为即使物理输出不是,也会使用序列化代码路径。如果您不熟悉这些特性,本文可能会有所帮助。
BeanSerializer b = (BeanSerializer) j;
for (Iterator <PropertyWriter> p = b.properties (); p.hasNext ();) {
  BeanPropertyWriter w = (BeanPropertyWriter) p.next ();
  String k = w.getName ();
  Object v = w.get (object);
}