将Java对象树序列化为自定义XML
想象一棵Java对象树,即某个类的顶级对象,其中包含一些属性,这些属性又是其他类的对象,依此类推,直到我们基本上达到基本类型,如整数或字符串等。例如:将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
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) {
...
}
}