2014-03-25 84 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)**文章特別好解釋。我想我能夠以某種方式將這種方法適應於我想達到的目的,因爲無論如何我都不是車輪改造者。所以謝謝你指出,我知道有人已經比我做得好多了。 –