FlexJson сериализует и десериализует интерфейс

1

Я получаю сообщение об ошибке, пытающееся десериализовать структуру данных, которая представляет собой список элементов, каждый из которых реализует интерфейс. Кроме того, одним из полей интерфейса является объект, и каждое наследование рассматривает этот объект как другое поле.

После стольких часов, проведенных по этой проблеме, любой ответ будет оценен.

Это ошибка, которую я получаю:

Исключение в потоке "main" java.lang.ClassCastException: java.lang.String не может быть отнесено к java.util.Map в файле flexjson.factories.BeanObjectFactory.instantiate(BeanObjectFactory.java:17) в flexjson.ObjectBinder.bind(ObjectBinder. java: 86) в flexjson.ObjectBinder.bindIntoObject(ObjectBinder.java:139) в flexjson.factories.ClassLocatorObjectFactory.instantiate(ClassLocatorObjectFactory.java:38) в flexjson.ObjectBinder.bind(ObjectBinder.java:86) в flexjson.ObjectBinder. bindIntoCollection (ObjectBinder.java:101) в flexjson.factories.ListObjectFactory.instantiate(ListObjectFactory.java:13) в flexjson.ObjectBinder.bind(ObjectBinder.java:86) в flexjson.ObjectBinder.bind(ObjectBinder.java:65) в flexjson.JSONDeserializer.deserialize(JSONDeserializer.java:158) в testSerizlizeDeserializeInterface.entryPointForTestingSerialize.main(entryPointForTestingSerialize.java:34)

Я сделал пример, если кто-то хотел бы попробовать и сыграть с ним...

  1. Интерфейс
  2. Тип EPersonType
  3. Наследование
  4. Основной класс
  5. Выход

Благодарю!

Интерфейс

    public interface IPerson {
        EPersonType getPersonType();
        String getName();
        void setName(String name);
            int getAge();
        void setAge(int age);
        Object getValue();
            void setValue(Object value);
    }

Это довольно простой интерфейс. Сложная часть, как я уже упоминал, заключается в том, что значение, представленное как объект, будет содержать разные значения, основанные на реализации интерфейса.

EPersonType

public enum EPersonType {
    Father,
    Mother,
}

Наследование

    public class Father implements IPerson {

    private String name;
    private int age;
    private String value;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int getAge() {
        return age;
    }

    @Override
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public Object getValue() {
        return value;
    }

    @Override
    public void setValue(Object value) {
        this.value = (String) value;
    }
    @Override
public EPersonType getPersonType() {
    return EPersonType.Father;
}


}

И еще один пример

public class Mother implements IPerson {
    private String name;
    private int age;
    private boolean value;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int getAge() {
        return age;
    }

    @Override
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public Object getValue() {
        return value;
    }

    @Override
    public void setValue(Object value) {
        this.value = (boolean) value;
    }
    @Override
public EPersonType getPersonType() {
    return EPersonType.Mother;
}


}

Основной класс

public class entryPointForTestingSerialize {

    public static void main(String[] args) {
        List<IPerson> family = new ArrayList<IPerson>();

        IPerson father = new Father();
        father.setAge(50);
        father.setName("Oz");
        father.setValue("Hello");

        IPerson mother = new Mother();
        mother.setAge(50);
        mother.setName("Mother");
        mother.setValue(false);

        family.add(father);
        family.add(mother);

        String serialized = new JSONSerializer().deepSerialize(family);

        System.out.println(serialized);

    List<IPerson> deserialized = (List<IPerson>) new flexjson.JSONDeserializer<List<IPerson>>()
            .use("values", new TypeLocator<String>("personType")
                    .add("Mother", Mother.class).add("Father", Father.class))
            .deserialize(serialized);

        System.out.println(deserialized);
    }
}

Выход

[{"age":50,"class":"testSerizlizeDeserializeInterface.Father","name":"Oz","personType":"Father","value":"Hello"},{"age":50,"class":"testSerizlizeDeserializeInterface.Mother","name":"Mother","personType":"Mother","value":false}]

Благодарю!

Ozrad.

Теги:
inheritance
serialization
flexjson

1 ответ

0
Лучший ответ

Я решил это, изменив инфраструктуру на лучшую, с моей точки зрения. Его название - XStream, и он обрабатывает все гладко и быстро. Эти строки кода, и все это было сделано:

    XStream xstream = new XStream(new DomDriver()); // does not require XPP3 library
    String xml = xstream.toXML(family);

и вернуть данные:

    List<IPerson> familyAfterSerialize = (List<IPerson>)xstream.fromXML(xml);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню