gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:58:03 25 4
gpt4 key购买 nike

想象一棵 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>

顺便说一下,请注意如何将此片段插入到其他某个层次结构中,例如,如果 Car 对象将是其他某个父对象的属性。

我的问题是:实现这个模式结构设计架构的正确方法是什么>?我认为我的问题需要一些澄清。我想到的第一个也是简单的实现方法类似于 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 序列化程序,在本例中对我来说是多余的。

最佳答案

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

关于java - 将 Java 对象树序列化为自定义 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22625305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com