Сейчас я работаю с Джексоном и у меня есть некоторые вопросы по этому поводу.
Прежде всего. У меня есть две службы, первая служба сбора и отправки данных, а вторая получает эти данные и, например, записывает их в файл.
Итак, первый сервис имеет подобную иерархию классов:
+----ConcreteC
|
Base ----+----ConcreteA
|
+----ConcreteB
А второй сервис имеет подобную иерархию классов:
ConcreteAAdapter extends ConcreteA implements Adapter {}
ConcreteBAdapter extends ConcreteB implements Adapter {}
ConcreteCAdapter extends ConcreteC implements Adapter {}
Первый сервис ничего не знает о ConcreteXAdapter
.
То, как я отправляю данные в первый сервис:
Collection<Base> data = new LinkedBlockingQueue<Base>()
JacksonUtils utils = new JacksonUtils();
data.add(new ConcreteA());
data.add(new ConcreteB());
data.add(new ConcreteC());
...
send(utils.marshall(data));
...
public class JacksonUtils {
public byte[] marshall(Collection<Base> data) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream() {
@Override
public byte[] toByteArray() {
return buf;
}
};
getObjectMapper().writeValue(out, data);
return out.toByteArray();
}
protected ObjectMapper getObjectMapper() {
return new ObjectMapper();
}
public Object unmarshall(byte[] json) throws IOException {
return getObjectMapper().readValue(json, Object.class);
}
public <T> T unmarshall(InputStream source, TypeReference<T> typeReference) throws IOException {
return getObjectMapper().readValue(source, typeReference);
}
public <T> T unmarshall(byte[] json, TypeReference<T> typeReference) throws IOException {
return getObjectMapper().readValue(json, typeReference);
}
}
Итак, я хочу десириализировать json в коллекцию ConcreteXAdapter
, а не в коллекцию ConcreteX
(ConcreteA -> ConcreteAAdapter, ConcreteB -> ConcreteBAdapter, ConcreteC -> ConcreteCAdapter
). В случае, который я описал, я хочу получить:
Collection [ConcreteAAdapter, ConcreteBAdapter, ConcreteCAdapter]
Как я могу это сделать?