Jackson Custom Deserialization - Deserialize в известный экземпляр объекта без аннотаций или микшинов JsontypeinfoJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Jackson Custom Deserialization - Deserialize в известный экземпляр объекта без аннотаций или микшинов Jsontypeinfo

Сообщение Anonymous »

У меня есть класс baseclass , что во время выполнения будет хранить ссылку на другой объект, который . BaseClass предназначен для расширения, поэтому я сделал это абстрактным, как SO:

Код: Выделить всё

abstract class BaseClass{
// see explanation for annotations below
@JsonIgnore private final Thing storedThing;
@JsonProperty private final String thingId;
protected BaseClass(){}  // empty constructor
protected BaseClass(Thing thing){
// store thing
}
// other stuff
}
< /code>
Thing
является полиморфным и имеет много данных. Таким образом, для сериализации/десериализации я собираюсь сохранить только идентификатор вещи вместо всего объекта (это жесткое требование). Так что, если у нас есть класс someclass реализация baseclass , его JSON может выглядеть так:

Код: Выделить всё

// SomeClass extends BaseClass
"SomeClass":{
"thingId" : "ahbjhadbv" // target id of stored Thing. All other info is ignored
}
< /code>
The intent being that during deserialization I can look up the actual Thing
экземпляр с использованием идентификатора ( хранится в другом месте и может быть запрошено) и вставьте это обратно. Например. SomeTherClass , который реализует BaseClass , может выглядеть так:

Код: Выделить всё

// SomeOtherClassextends BaseClass
"SomeOtherClass":{
"thingId" : "asdawetgvd" // target id of stored Thing. All other info is ignored
"someOtherData": {...}
"evenMoreData" : {...}
}
< /code>
Implementing serialization to suit my needs was simple enough with Jackson.
Now the annoying/interesting bit - for reasons I can't go into, I am hamstrung with these constraints:

[*]I cannot use mixins/@JsonTypeInfo
/@jsonsubtypes аннотации.
[*] Я не могу предоставить многоуровневый конструктор для обоих вещей и thingid на baseclass .
[*] Даже если я наталкиваю на конструкции, я не имею гарантирования, что реализации Baseclass x.getParameterCount() == 0)
T instance;
if(hasEmptyConstructor){
instance = clazz.getConstructor().newInstance();
} else {
Thing dummyThing = getDummyThing(); // empty thing object needed only for deserialzation
instance = clazz.getConstructor(Thing.class).newInstance(dummyThing);
}

// populate instance with other state data from serializedData
}
< /code>
And now the question - given that the class T[/code] может иметь поля данных состояния, отличные от Thingid , как я могу надежно заполнить поля создания объекта с указанными данными с использованием Джексона? Получите имена поля. Мне нужно как -то использовать Джексона, но я не смог выяснить, как. Большинство доступных методов, по -видимому, требуют типа вместо создания создания объекта, и я не могу найти никакого способа внедрить указанный объект в десериализатор.


Подробнее здесь: https://stackoverflow.com/questions/797 ... ce-without
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»