微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过 YAML 加载基于抽象类的对象的数组列表

如何解决如何通过 YAML 加载基于抽象类的对象的数组列表

我正在尝试从 YAML 文件加载多态对象的 ArrayList,但收到此错误消息:

线程“main”中的异常无法为 tag:yaml.org,2002:dirty.AbstractObj 构造 java 对象;异常=没有找到适合类dirty.AbstractObj的2个参数的构造函数 在“读者”中,第 2 行,第 1 列: - !obj1 ^

YAML 文件

---
- !obj1
  abstractObjInt: 1222
  obj1Int: 333444
- !obj2
  abstractObjInt: 987
  obj2Int: 5555

Loader.java:

public class Loader {
    private static Yaml yaml;

    public Loader() {}

    public static void main(String[] args) {
        initAbstractObjs();
    }

    protected static ArrayList<AbstractObj> initAbstractObjs() {
        Constructor constructor = new Constructor(AbstractObj.class);
        constructor.addTypeDescription(new TypeDescription(Obj1.class,new Tag("!obj1")));
        constructor.addTypeDescription(new TypeDescription(Obj2.class,new Tag("!obj2")));
        yaml = new Yaml(constructor);
        InputStream input = loadFile();
        ArrayList<AbstractObj> abstractObjs = yaml.load(input);

        return abstractObjs;
    }
    
    private static InputStream loadFile() {
        File file = new File("path/to/file/file.yml");
        InputStream input = null;
        
        try {
           input = new FileInputStream(file);
        } catch (IOException e) {
            e.printstacktrace();
        }

        return input;
    }
}

AbstractObj.java

public abstract class AbstractObj {
    protected int abstractObjInt;
    
    public AbstractObj() {}

    public int getAbstractObjInt() {
        return abstractObjInt;
    }

    public void setAbstractObjInt(int abstractObjInt) {
        this.abstractObjInt = abstractObjInt;
    }
}

obj1.java

public class Obj1 extends AbstractObj {
    private int obj1Int;

    public Obj1() {}

    public void setobj1Int(int obj1Int) {
        this.obj1Int = obj1Int;
    }

    public int getobj1Int() {
        return obj1Int;
    }
}

Obj2.java

public class Obj2 extends AbstractObj {
    private int obj2Int;
    
    public Obj2() {}

    public void setobj2Int(int obj2Int) {
        this.obj2Int = obj2Int;
    }

    public int getobj2Int() {
        return obj2Int;
    }
}

谁能指出我做错了什么。

解决方法

您告诉构造函数您的根类型是 <b-form-select v-model="xxx" :options="yyy" width: 50%></b-form-select> ,而实际上不是。

改为这样做:

AbstractObj

由于 SnakeYaml 在默认情况下从 YAML 序列构造 Constructor constructor = new Constructor(); ,因此您无需提供明确的根类型。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。