2014-03-25 46 views
1

想象一下Java对象的树,即某个类的顶级对象,它包含一些属性,而这些属性又是其他类的对象,等等,直到我们基本达到基本类型,如整数或字符串,等等。例如:将Java对象的树序列化到自定义XML中

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对象将是某个其他父对象的属性。

我的问题是:这将是实现这一图案方式structurewisedesignwisearchitecturewise的正确方法?我认为我的问题需要澄清。实现这一点,在我脑海的第一个和简单的方法是类似于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序列化程序,在这种情况下对我来说是多余的。

回答

2

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

+0

XStream确实是一个非常有趣的软件,纯粹是通用的XML编组/解组。我还发现JAXB现在与Java SE捆绑在一起,是另一种可以做同样的选择,甚至更多! ** [如何将JAXB与XStream进行比较?](http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html)**文章特别好解释。我想我能够以某种方式将这种方法适应于我想达到的目的,因为无论如何我都不是车轮改造者。所以谢谢你指出,我知道有人已经比我做得好多了。 –