创建 jackson ObjectMapper 实例的克隆

Ram*_*man 2 java jackson

我正在编写一个需要com.fasterxml.jackson.databind.ObjectMapper实例的库。库的用户应该能够为 ObjectMapper 或 ObjectMapper 实例本身提供配置。但我也添加/修改了序列化程序的一些设置,而不会影响用户的 ObjectMapper 实例。

有没有办法创建 ObjectMapper 实例的副本/克隆?

看起来ObjectMapper clonedInstance = new ObjectMapper(originalMapper.getFactory())可以工作。但我不确定是否有任何我遗漏的东西。ObjectMapper 的行为会和原来的完全一样吗?

目前这是我的代码:

public MyLibraryClass {
    private ObjectMapper internalMapper;

    public MyLibraryClass(ObjectMapper mapper) {
        if (mapper == null) {
            internalMapper = new ObjectMapper();
        } else {
            internalMapper = new ObjectMapper(mapper.getFactory());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

acd*_*ior 6

您可以使用ObjectMapper#copy()

copy

public ObjectMapper copy()
Run Code Online (Sandbox Code Playgroud)

用于创建ObjectMapper与此实例具有相同初始配置的新实例的方法。请注意,这还需要制作底层JsonFactory实例的副本。

当需要多个不同配置的映射器时,通常使用方法。虽然配置是共享的,但缓存的序列化器和反序列化器是不共享的,这意味着新实例在使用前可能会重新配置;这意味着它的行为方式与从头构建实例的方式相同。

自:2.1

例子:

public MyLibraryClass {
    private ObjectMapper internalMapper;
    public MyLibraryClass(ObjectMapper mapper) {
        if (mapper == null) {
            internalMapper = new ObjectMapper();
        } else {
            internalMapper = mapper.copy();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

也可以从ObjectMapperjavadocs 类中看到这个观察:

(...) 方法copy(),它创建具有特定配置的映射器的克隆,并允许在使用之前配置复制的实例。请注意,copy()操作与构建新ObjectMapper实例一样昂贵:如果可能,如果您打算将它们用于多个操作,您仍然应该池化和重用映射器。