想象一下Java对象的树,即某个类的顶级对象,它包含一些属性,而这些属性又是其他类的对象,依此类推,直到我们基本达到基本类型,如整数或字符串等。例如:< / p>
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>
顺便说一下,注意如何将这个片段插入到其他层次结构中,例如,如果Car
对象是某个其他父对象的属性。
我的问题是:实现此模式,结构式, designwise ,架构?我认为我的问题需要澄清一些。我想到的实现这一点的第一个简单方法类似于Java的传统toString
:
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) {
...
}
}
在将这种XML序列化直接添加为相应类的方法的意义上,这个想法有多好?我将其限制为Element
作为参数是否很好(尽管由于Java XML API的设计方式,我有点被迫这样做)?我回来Element
好吗?您是否有任何想法可以从此实现的架构角度改进?欢迎任何建议。
我知道java.beans.XMLEncoder
工具,但这是Java特定的XML序列化程序,在这种情况下对我来说是多余的。
答案 0 :(得分:2)
为什么不使用像XStream这样的东西?如果这不适用,那么我建议您使用反射API来允许您将生成XML的代码分开。也许您可以使用反射来编写泛型方法,而不是为每个类编写特定的XML序列化代码。如有必要,您可以使用自定义注释在类中指定更细粒度的行为。但感觉就像重新发明轮子一样,因为像XStream这样的东西可能会为你做很多事情。