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