问题描述
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());