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

时间:2014-03-25 04:13:19

标签: java xml object dom serialization

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

1 个答案:

答案 0 :(得分:2)

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