java - JAXB 解码不起作用

标签 java jaxb marshalling unmarshalling

我已经建立了一个项目来测试另一个项目的编码。 编码正在工作。我得到了正确的 xml 文件,但解码不起作用。我只得到关系名称(字符串)。缺少属性和功能依赖性。

编辑:这是来源:Sourcecode

请看一下类(class):

主要:

public class Main {

public static void main(String[] args){

    Relation db = new Relation();

    Attribute a1 = new Attribute("Attribute 1", true, false);
    Attribute a2 = new Attribute("Attribute 2", false, false);
    Attribute a3 = new Attribute("Attribute 3", false, true);

    db.addAttribute(a1);
    db.addAttribute(a2);
    db.addAttribute(a3);

    ArrayList<String> src = new ArrayList<String>();
    src.add("Attribute 1");

    ArrayList<String> dest = new ArrayList<>();
    dest.add("Attribute 2,Attribute 3");

    FDs f1 = new FDs(src, dest);

    db.addFd(f1);

    exportToXml saver = new exportToXml();
    try {
        saver.SaveDbNow(db);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    //Export again to test output
    Relation db2 = new Relation();

    importFromXml reader = new importFromXml();
    try {
        reader.ReadDbNow(db2);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        saver.SaveDbNow2(db2);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

关系:

@XmlRootElement(name = "Relation")
public class Relation {
@XmlElement(name = "RelName")
String name;

@XmlElement(name = "Attribute")
private ArrayList<Attribute> attrList;
@XmlElement(name = "FD")
private ArrayList<FDs> fdsList;

public Relation() {
    this.attrList = new ArrayList<>();
    this.fdsList = new ArrayList<>();
    this.name = "Testname";
}

public Relation(String name, ArrayList<Attribute> attrList, ArrayList<FDs> fdsList)   {
    super();
    this.attrList = attrList;
    this.fdsList = fdsList;
}

@XmlTransient
public ArrayList<Attribute> getAttrList() {
    return attrList;
}

public void setAttrList(ArrayList<Attribute> attrList) {
    this.attrList = attrList;
}

@XmlTransient
public ArrayList<FDs> getFdsList() {
    return fdsList;
}

public void setFdsList(ArrayList<FDs> fdsList) {
    this.fdsList = fdsList;
}

public void addAttribute(Attribute a) {
    this.attrList.add(a);
}

public void addFd(FDs fd) {
    this.fdsList.add(fd);
}

}

属性:

public class Attribute {
@XmlElement( name = "Attributename")
private String name;
@XmlElement( name = "isPK")
private boolean isPK;
@XmlElement( name = "isFK")
private boolean isFK;

public Attribute(){

}


public Attribute(String name, boolean isPK, boolean isFK) {
    super();
    this.name = name;
    this.isPK = isPK;
    this.isFK = isFK;
}

@XmlTransient
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
@XmlTransient
public boolean isPK() {
    return isPK;
}

public void setPK(boolean isPK) {
    this.isPK = isPK;
}

@XmlTransient
public boolean isFK() {
    return isFK;
}
public void setFK(boolean isFK) {
    this.isFK = isFK;
}   
}

FD:

public class FDs {
@XmlElement( name = "Source")
private ArrayList<String> src;
@XmlElement( name = "Destination")
private ArrayList<String> dest;

public FDs(){

}

public FDs(ArrayList<String> src, ArrayList<String> dest) {
    super();
    this.src = src;
    this.dest = dest;
}

@XmlTransient
public ArrayList<String> getSrc() {
    return src;
}
public void setSrc(ArrayList<String> src) {
    this.src = src;
}

@XmlTransient
public ArrayList<String> getDest() {
    return dest;
}
public void setDest(ArrayList<String> dest) {
    this.dest = dest;
}
}

导出:

public class exportToXml {

public void SaveDbNow(Object saveMe) throws Exception {
    JAXB.marshal(saveMe, new File("test.xml"));
}

public void SaveDbNow2(Object saveMe) throws Exception {
    JAXB.marshal(saveMe, new File("test2.xml"));
}
}

导入:

public class importFromXml {

public void ReadDbNow(Object readMe) throws Exception {
    readMe = JAXB.unmarshal(new FileInputStream("test.xml"), Relation.class);
}
}

提前致谢!

编辑: 输出1:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relation>
<RelName>Testname</RelName>
<Attribute>
    <Attributename>Attribute 1</Attributename>
    <isPK>true</isPK>
    <isFK>false</isFK>
</Attribute>
<Attribute>
    <Attributename>Attribute 2</Attributename>
    <isPK>false</isPK>
    <isFK>false</isFK>
</Attribute>
<Attribute>
    <Attributename>Attribute 3</Attributename>
    <isPK>false</isPK>
    <isFK>true</isFK>
</Attribute>
<FD>
    <Source>Attribute 1</Source>
    <Destination>Attribute 2,Attribute 3</Destination>
</FD>

输出2:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relation>
<RelName>Testname</RelName>
</Relation>

最佳答案

当前行为的说明

Main 类中,您实例化 Relation 的新实例,构造函数将 name 属性填充为 “Testname”Relation 实例中没有填充任何其他内容,这就是您看到的 XML 输出的原因。

    // Export again to test output
    Relation db2 = new Relation();

    importFromXml reader = new importFromXml();
    try {
        reader.ReadDbNow(db2);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        saver.SaveDbNow2(db2);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

潜在的解决方案

更改 importFromXml 类上的 ReadDbNow 方法以返回其解码的 Relation 实例。

import java.io.FileInputStream;
import javax.xml.bind.JAXB;

public class importFromXml {

    public Relation ReadDbNow() throws Exception {
        return JAXB
                .unmarshal(new FileInputStream("test.xml"), Relation.class);
    }
}

Main 类中更改代码以执行以下操作:

    // Export again to test output
    Relation db2 = null;

    importFromXml reader = new importFromXml();
    try {
        db2 = reader.ReadDbNow();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        saver.SaveDbNow2(db2);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

关于java - JAXB 解码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989972/

相关文章:

java - 假装和未声明的 404 Not Found 可抛出异常

java - 如何将多个视频文件一起写入以创建一个视频文件

java - 删除部分 XML 声明,编码 ="UTF-8"独立 ="yes"JAXB

c# - 在 C# 中使用数组成员编码(marshal)结构

java - 解析的 SOAP 响应与收到的响应不同

用于读取电子邮件和创建 JIRA 票证的 Java 守护进程?

java - Jaxb 编码 Point 变量

java - 使用命名空间解码 XML 响应

c# - 将结构体数组从 C# 编码到 VC++

java - JBOSS 控制台日志记录,在生产环境中推荐吗?