Сохранять информацию о типе при сериализации Джексона и соответственно десериализовать - PullRequest
1 голос
/ 18 июня 2019

Я застрял в случае использования, когда у меня есть Объект класса A, скажем, a, а Объект класса B, скажем, b, b intern имеет переменную-член подкласса класса C, скажем, c.Мой вариант использования заключается в том, что я хочу сериализовать / десериализовать a таким образом, чтобы при сериализации я добавлял переменную типа к члену c, с помощью которого я могу распознать, пока подкласс принадлежит объекту.Я пытаюсь добиться этого через Джексона.См. Код ниже:

Class A{
B b;
}

Class B{
C c;
}

Class C {
}

Class D extends C{
int a;
}

Class E extends C{
string b;
}

Ожидается, когда у меня C c = новый D (), B b = новый B (c), A = новый A (b):

"A":{
    "B":{
        "type":D
        "C":c
    }
}

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Спасибо за все ответы, которые мне удалось сделать, используя ответ @ jb-nizet, используя JsonTypeInfo с JsonSubTypes. Вот аннотации, которые я использовал:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = D.class, name = "D"),
               @JsonSubTypes.Type(value = E.class, name = "E")})

Поскольку я не мог редактировать класс C по причине владения, я использую это с классом mixIn. Вот как я его создал:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = D.class, name = "D"),
               @JsonSubTypes.Type(value = E.class, name = "E")})
abstract class CMixIn {

}

Вот как я использовал класс mixIn:

private ObjectMapper objectMapper = new ObjectMapper().addMixIn(C.class, CMixIn.class);

Теперь для сериализации Объекта А класса:

String serializedString = objectMapper.writeValueAsString(a);

Для десериализации вышеуказанной строки:

objectMapper.readValue(serializedString, A.class);
0 голосов
/ 18 июня 2019

Попробуйте avro (или некоторые сторонние библиотеки)?

https://docs.oracle.com/database/nosql-12.1.3.0/GettingStartedGuide/avroschemas.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...