Десериализация Json в другую иерархию классов с использованием Джексона

Сейчас я работаю с Джексоном и у меня есть некоторые вопросы по этому поводу.

Прежде всего. У меня есть две службы, первая служба сбора и отправки данных, а вторая получает эти данные и, например, записывает их в файл.

Итак, первый сервис имеет подобную иерархию классов:

         +----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]

Как я могу это сделать?

22
задан pbespechnyi 26 April 2012 в 20:14
поделиться