将Java对象树序列化为自定义XML

将Java对象树序列化为自定义XML,java,xml,object,dom,serialization,Java,Xml,Object,Dom,Serialization,想象一棵Java对象树,即某个类的顶级对象,其中包含一些属性,这些属性又是其他类的对象,依此类推,直到我们基本上达到基本类型,如整数或字符串等。例如: class Car { private Door _leftDoor; private Door _rightDoor; } class Door { private String _name; } 通过序列化类Car的顶级对象,我希望看到一个XML文档,例如: <object type="Car"> <pr

想象一棵Java对象树,即某个类的顶级对象,其中包含一些属性,这些属性又是其他类的对象,依此类推,直到我们基本上达到基本类型,如整数或字符串等。例如:

class Car {
  private Door _leftDoor;
  private Door _rightDoor;
}

class Door {
  private String _name;
}
通过序列化类
Car
的顶级对象,我希望看到一个XML文档,例如:

<object type="Car">
  <property type="Door" identifier="_leftDoor">
    <object type="Door">
      <property type="String" identifier="_name">I am a left door!</property>
    </object>
  </property>
  <property type="Door" identifier="_rightDoor">
    <object type="Door">
      <property type="String" identifier="_name">I am a right door!</property>
    </object>
  </property>
</object>
从将这种XML序列化直接添加为相应类的方法的意义上讲,这个想法有多好?我限制它使用
元素
作为参数(尽管由于JavaXMLAPI的设计方式,我不得不这样做),这是否好?返回
元素
好吗?从体系结构的角度来看,在这个实现中可以改进什么,您有什么想法吗?欢迎任何建议


我知道
java.beans.XMLEncoder
功能,但这是特定于java的XML序列化程序,在这种情况下对我来说是多余的。

为什么不使用XStream之类的工具呢?如果这不适用,那么我建议您使用反射API使生成XML的代码保持独立。也许您可以使用反射编写一个通用方法来完成这项工作,而不是为每个类编写特定的XML序列化代码。如果需要,可以使用自定义注释在类中指定更细粒度的行为。但是感觉就像是重新发明轮子,因为像XStream这样的东西可能可以为您做很多事情。

XStream确实是一款非常有趣的软件,纯粹是通用的XML编组/解编。我还发现,现在与JavaSE捆绑在一起的JAXB是做同样事情甚至更多事情的另一种选择!这篇文章特别好地解释了这一点。我想我将能够以某种方式使这种方法适应我想要实现的目标,因为我无论如何都不是一个车轮改造迷。所以谢谢你指出这一点,我知道有人已经做得比我好得多了。
class Car {
  ...

  public Element toElement(Element element) {
    Document document = element.getOwnerDocument();
    Attr attr;

    Element objectElement = document.createElement("object");
    element.appendChild(objectElement);

    attr = document.createAttribute("type");
    attr.setValue(class.getSimpleName());
    objectElement.setAttributeNode(attr);

    Element propertyElement;

    propertyElement = document.createElement("property");
    objectElement.appendChild(propertyElement);

    attr = document.createAttribute("type");
    attr.setValue(_leftDoor.getClass().getSimpleName());
    propertyElement.setAttributeNode(attr);

    attr = document.createAttribute("identifier");
    attr.setValue("_leftDoor");
    propertyElement.setAttributeNode(attr);

    _leftDoor.toElement(propertyElement);

    propertyElement = document.createElement("property");
    objectElement.appendChild(propertyElement);

    attr = document.createAttribute("type");
    attr.setValue(_rightDoor.getClass().getSimpleName());
    propertyElement.setAttributeNode(attr);

    attr = document.createAttribute("identifier");
    attr.setValue("_rightDoor");
    propertyElement.setAttributeNode(attr);

    _rightDoor.toElement(propertyElement);

    return objectElement;
  }
}

class Door {
  ...

  public Element toElement(Element element) {
    ...
  }
}