【问题标题】:Serialize a Tree of Java Objects into Custom XML将 Java 对象树序列化为自定义 XML
【发布时间】:2014-05-02 17:57:43
【问题描述】:

想象一棵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 序列化程序,在这种情况下对我来说是多余的。

【问题讨论】:

    标签: java xml object dom serialization


    【解决方案1】:

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

    【讨论】:

    • XStream 确实是一款非常有趣的软件,纯粹是通用的 XML 编组/解组。我还发现现在与 Java SE 捆绑在一起的 JAXB 是另一种实现相同甚至更多功能的替代方案! How Does JAXB Compare to XStream? 文章很好地解释了这一点。我想我将能够以某种方式使这种方法适应我想要实现的目标,因为无论如何我都不是车轮改造的粉丝。所以感谢您指出这一点,我知道有人已经比我做得更好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多