java - 为什么 XmlEncoder 不将类的成员插入到 xml 文件中?

标签 java xml-serialization

我正在尝试将一些数据放入 XML 文件中。这是代码:

@Test
public void TestProximities() {

    // Create a proximity 
    ISpaceComponent solarSystem = Init.createSolarSystemProximities();
    solarSystem.runTtest();

    Path filePath = Paths.get("c:\\temp\\junk.bin");

    File xmlFile = new File("c:\\temp\\");
    boolean success = xmlFile.mkdirs();
    if (!success && ! xmlFile.exists() ) {
        // Directory creation failed
        System.out.println("Failed to create a file: " + filePath);
    }

    try {
        XMLEncoder fileXml = new XMLEncoder( new BufferedOutputStream( new FileOutputStream("c:\\temp\\junk.xml") ) );
        fileXml.writeObject(solarSystem);
        fileXml.flush();
        fileXml.close();

    } catch (Exception e) {
        e.printStackTrace();
        System.out.println(e.getMessage());

    }

}

初始化.createSolarSystemProximities():

public static ISpaceComposite createSolarSystemProximities() {

    // Proximities
    ISpaceComposite solarSystem = new SpaceComposite("The Solar System");
    solarSystem.addComponent(new Star("Sol"));      

    ISpaceComposite MercuryProximity = new SpaceComposite("Mercury proximity");
    MercuryProximity.addComponent(new Planet("Mercury"));
    solarSystem.addComponent(MercuryProximity);

    ISpaceComposite VenusProximity = new SpaceComposite("Venus proximity");
    VenusProximity.addComponent(new Planet("Venus"));
    solarSystem.addComponent(VenusProximity);

    ISpaceComposite EarthProximity = new SpaceComposite("Earth proximity");
    EarthProximity.addComponent(new Planet("The Earth"));
    EarthProximity.addComponent(new Moon("The Moon"));
    solarSystem.addComponent(EarthProximity);

    ISpaceComposite MarsProximity = new SpaceComposite("Mars proximity");
    MarsProximity.addComponent(new Planet("Mars"));
    MarsProximity.addComponent(new Moon("Phobos"));
    MarsProximity.addComponent(new Moon("Deimos"));
    solarSystem.addComponent(MarsProximity);

    return solarSystem;

} 

空间复合类看起来像这样:

public class SpaceComposite extends SpaceComponent implements ISpaceComposite {
    public static final long serialVersionUID = Data.serialVersionUID;
    private ArrayList<ISpaceComponent> _components;
private int _currentMoonIndex;

}

“SpaceComposite”也有默认的无参数构造函数。但是唯一插入到文件中的是它的名称,它派生自“SpaceComponent”类

public abstract class SpaceComponent implements ISpaceComponent, Serializable{
    private String _title;
    public static final long serialVersionUID = Data.serialVersionUID;

    // Default constructor
    public SpaceComponent(){
        _title = "";
    }
 }

我该如何解决这个问题?

最佳答案

XmlEncoder使用 JavaBean 约定捕获属性。它通过克隆对象图并记录创建克隆所需的步骤来工作。您希望在没有任何自定义的情况下与 XmlEncoder 一起使用的类需要遵循 JavaBeans 约定(getXYZ/setXYZ 属性或 isAbc/setAbc boolean 属性等)我的我猜你的类中唯一可用的属性是 Name,因此它是唯一被序列化的属性。

链接中的文章还解释了如何通过提供您自己的持久性委托(delegate)来自定义流程,但我会先尝试添加 getter/setter 以查看这是否足以使其正常工作。

关于java - 为什么 XmlEncoder 不将类的成员插入到 xml 文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9093231/

相关文章:

java - Jhipster 应用程序生成失败

java - 如何获取当前 jsp 应用程序版本的内部版本号(使用 CVS)

c# - 当我使用 XmlSerializer 反序列化时,为什么我的 DbNull 不是单例?

serialization - 删除 DataContractSerializer XML 输出中的 "d1p1"命名空间前缀

java - JXTable 和滚动条上方的标题单元格

java - 安卓 : App Visit Count using Firebase Database

java - 选择要序列化的属性

c# - 如何使用 XmlSerializer 对 xHtml 文本进行 sanitizer ?

c# - 序列化 RichTextBox,包括大小、背景颜色、位置

Java自动设置按钮名称