2015-06-19 2 views
-1

Я хочу преобразовать один тип Java в другой, используя ObjectMapper.convertValue(). Исходный объект имеет определенный тип, но тип назначения изменяется. По соображениям производительности я хочу избежать сериализации любых исходных полей, которые не определены в типе назначения. Я знаю, что десериализация может быть сконфигурирована так, чтобы игнорировать дополнительные поля, но, насколько я понимаю, все исходные поля все равно будут оцениваться в промежуточной сериализации. Есть ли способ создать сериализатор, который будет оценивать только поля, существующие в типе назначения?Преобразование значений Джексона с ленивой сериализацией

Как правило, при преобразовании между типами Java можно использовать схему типа назначения для определения стратегии сериализации для типа источника?

+1

Взглянув на http://wiki.fasterxml.com/JacksonHowToCustomSerializers, вы можете увидеть, что вы можете добавить свой собственный сериализатор. – user1929959

+0

@ user1929959 Я знаю, что вы можете выполнять пользовательскую сериализацию. Я пытаюсь понять, как адаптировать его к типу назначения при преобразовании значений. – shmosel

+0

Возможно, вы могли бы воспользоваться http://wiki.fasterxml.com/JacksonJsonViews, вам нужно будет изменить ваш convertValue на двухэтапный сериализатор, а затем десериализовать. – roby

ответ

0

Нет. Как вы говорите, вы можете игнорировать свойства десериализатора, которые он не распознает, но нет никакой функции для обрезки контента, сериализованного.

Но вы уверены, что это настоящая проблема с производительностью? Используемая промежуточная форма (TokenBuffer) представляет собой простую последовательность значений листьев, и поскольку String s уже существует, накладные расходы должны быть довольно низкими. Вне всякого сомнения, полной полноразмерной сериализации в JSON нет.

+0

Это не фактическая сериализация, о которой я беспокоюсь. Я использую пользовательскую сериализацию, которая имеет дополнительные накладные расходы для каждого поиска в поле. (Даже без пользовательской сериализации может существовать исходный метод 'getFoo()', который дорого вызывается.) – shmosel

+0

. Одна вещь, которую вы можете попробовать использовать, - это либо динамические фильтры JSON, либо даже JSON Views. Оба могут быть изменены для каждого вызова, и они будут применяться и для 'convertValue()', так как путь кода сериализации используется, даже если физический вывод не является. Эта статья - http://www.cowtowncoder.com/blog/archives/2011/09/entry_461.html - может помочь, если вы не знакомы с этими функциями. – StaxMan

0

Вы можете получить BeanSerializer для object как это:

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

Если j не является экземпляром BeanSerializer, то это обычай сериализатору и нет никакого пути вокруг сериализации все это - и затем преобразовать его в a Map. Но если после этого:

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); 
} 

Очевидно, что вы можете задержать вызова get() на писателя так долго, как вы хотите. Это немного хаки, но я не нашел лучшего решения.

Смежные вопросы