Jackson ObjectMapper和JsonGenerator-线程安全吗?

问题描述

Jackson的每个序列化请求ObjectMapper都会创建一个新的JsonGenerator。从这个意义上讲,保证了线程安全。我能看到的唯一可能导致您看到的行为的情况是,您CustomSerializer是否拥有一些正在共享的实例字段并且正在执行某种内部同步。

解决方法

我目前有一个项目,该项目使用杰克逊更快的xml使用自定义序列化器和反序列化器将POJO序列化/反序列化到Json。据我了解,一旦创建并配置了ObjectMapper,它就是线程安全的。但是,我注意到使用JMeter运行测试时,偶尔会发生以下情况-

  • 线程1进入CustomerSerializer并开始序列化
  • 线程2进入CustomSerializer,与线程1交互,并开始从头到尾进行序列化
  • 线程1恢复,最后被序列化的内容丢失了

似乎是在第二个线程进入时重置了JsonGenerator实例-
肯定不应该发生这种情况吗?我已经检查了几个站点和线程,以查看是否需要设置任何设置或功能,但是据我了解,ObjectMapper重用了JsonGenerator实例,这可能是问题吗?

以下是我的自定义序列化器的代码段…

@Override
public final void serialize(Object o,JsonGenerator jsonGenerator,SerializerProvider serializerProvider) throws IOException {

    jsonGenerator.writeStartObject();

    ... Code here ....

    jsonGenerator.writeEndObject();

    closeJsonGenerator(jsonGenerator);
}

以及使用它的例子

SimpleModule sm = new SimpleModule();
sm.addSerializer(new myCustomSerializer());
new ObjectMapper().registerModule(sm)
                  .writeValue(new myObject());

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”