首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FlexJson序列化和反序列化接口

FlexJson序列化和反序列化接口
EN

Stack Overflow用户
提问于 2014-04-26 00:34:55
回答 1查看 921关注 0票数 1

我遇到一个错误,试图反序列化我的数据结构,这是一个条目列表,每个项都实现了一个接口。此外,接口的一个字段是object,每个继承都将该对象视为不同的字段。

在这个问题上花了这么多时间之后,任何答案都将不胜感激。

,这是我收到的错误:

线程"main“中的异常:不能在flexjson.factories.BeanObjectFactory.instantiate(BeanObjectFactory.java:17) at flexjson.ObjectBinder.bind(ObjectBinder.java:86) at flexjson.ObjectBinder.bindIntoObject(ObjectBinder.java:139) at flexjson.factories.ClassLocatorObjectFactory.instantiate(ClassLocatorObjectFactory.java:38) at flexjson.ObjectBinder.bind(ObjectBinder.java:86)上将java.lang.String转换为java.util.Map在flexjson.ObjectBinder.bindIntoCollection(ObjectBinder.java:101) at flexjson.factories.ListObjectFactory.instantiate(ListObjectFactory.java:13) at flexjson.ObjectBinder.bind(ObjectBinder.java:86) at flexjson.ObjectBinder.bind(ObjectBinder.java:65) at flexjson.JSONDeserializer.deserialize(JSONDeserializer.java:158) at testSerizlizeDeserializeInterface.entryPointForTestingSerialize.main(entryPointForTestingSerialize.java:34)

我举了个例子如果有人也想玩的话.

  1. 接口
  2. The EPersonType
  3. 继承
  4. 主修班
  5. 输出量

谢谢!

接口

代码语言:javascript
复制
    public interface IPerson {
        EPersonType getPersonType();
        String getName();
        void setName(String name);
            int getAge();
        void setAge(int age);
        Object getValue();
            void setValue(Object value);
    }

这是一个非常简单的界面。正如我已经提到的,棘手的部分是表示为对象的值将包含基于接口实现的不同值。

EPersonType

代码语言:javascript
复制
public enum EPersonType {
    Father,
    Mother,
}

继承

代码语言:javascript
复制
    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;
}


}

和另一个实例

代码语言:javascript
复制
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;
}


}

主类

代码语言:javascript
复制
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);
    }
}

输出

代码语言:javascript
复制
[{"age":50,"class":"testSerizlizeDeserializeInterface.Father","name":"Oz","personType":"Father","value":"Hello"},{"age":50,"class":"testSerizlizeDeserializeInterface.Mother","name":"Mother","personType":"Mother","value":false}]

谢谢!

奥兹拉德。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-28 17:26:41

从我的角度来说,我通过把基础设施改造成更好的基础设施来解决这个问题。它的名字是XStream,它处理一切事情都很顺利和迅速。这些代码行都完成了:

代码语言:javascript
复制
    XStream xstream = new XStream(new DomDriver()); // does not require XPP3 library
    String xml = xstream.toXML(family);

为了拿回数据:

代码语言:javascript
复制
    List<IPerson> familyAfterSerialize = (List<IPerson>)xstream.fromXML(xml);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23305166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档