Преобразование объекта во что-то другое перед его сериализацией с использованием FasterXML Jackson

public void serialize(IPerson person, OutputStream output) throws Exception {}

public void deserialize(InputStream input) throws Exception {}

У меня есть интерфейс с именем IPerson, он имеет базовую функциональность.

Я хочу сериализовать объект человека и иметь возможность десериализовать его из метода десериализации.

Однако сценарий таков, что я не могу использовать сериализуемый интерфейс Java, так как не могу быть уверен, какая реализация IPerson будет использоваться.

Я решил использовать Jackson's FasterXML, используя ObjectMapper m = new ObjectMapper();

Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку IPerson является интерфейсом, я не могу сериализовать его напрямую, используя mapper.writerValue(output, person), я решил, что должен преобразовать этот объект во что-то другое, скажем, в ByteArray, а затем сериализовать его?

Кроме того, это будет преобразовывать это что-то еще в объект при десериализации? У меня минимальный опыт в том, во что именно я должен преобразовать этот объект и как это сделать? Любые идеи?


person Teodorico Levoff    schedule 05.03.2016    source источник
comment
Если бы вы преобразовали объект в массив байтов, это потребовало бы его сериализации...   -  person Sami Kuhmonen    schedule 05.03.2016


Ответы (1)


При использовании ObjectMapper по умолчанию вам необходимо убедиться, что объекты, которые вы сериализуете, являются Java Beans. Для классов, не связанных с bean-компонентами, вы можете установить видимость поля с помощью m.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); или аннотировать свой класс с помощью @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY).

Для десериализации вам нужно будет указать ObjectMapper целевой тип. Это можно сделать, указав конкретный тип реализации для readValue или сохранив имя класса в экспортированном JSON. Для этого вы можете установить m.enableDefaultTypingAsProperty(DefaultTyping.OBJECT_AND_NON_CONCRETE, "__class"); и аннотировать свои объекты с помощью @JsonTypeInfo

ObjectMapper om = new ObjectMapper();
om.enableDefaultTypingAsProperty(DefaultTyping.OBJECT_AND_NON_CONCRETE, "__class");

IPerson value = new MyPerson();
String s = om.writeValueAsString(value);
IPerson d = om.readValue(s, IPerson.class);

с использованием

interface IPerson {
   void doSomething();
}

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "__class")
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
class MyPerson implements IPerson {
    String name;

    @Override
    public void doSomething() {
    }
}

Обратите внимание, что для работы или работы с @JsonCreator и @JsonProperty вам понадобится конструктор по умолчанию (см. jackson-annotations для подробностей)

person nyname00    schedule 05.03.2016