2009-11-18 31 views
1

我是Castor和數據綁定的新手。我正在研究一個應用程序,它部分需要從套接字中取出數據並解開數據來製作POJO。現在,我已經得到了套接字的東西,並且我甚至使用Ant和Castor生成並編譯了Java文件。腳輪和插座

下面是問題:我將收到的數據流可能是大約9個不同對象之一。也就是說,我收到一個文本流(XML),它代表一個對象,其中包含我將要操作的對象;再次,取決於對象類型。如果它只是一個對象,那麼很簡單:調用unmarshall命令並繼續我的快樂方式。但是,因爲它可能是多種對象中的一種,我知道誰該解開什麼東西?我讀到了映射,但是我沒有得到它,或者它看起來像一個靜態映射,而不是一個動態映射。

任何幫助在那裏?

+0

沒人?這令人失望。 – Dave 2009-11-20 18:44:20

+0

這不是我不喜歡你的評論,而只是它並沒有真正回答具體問題。我不想在我的模式中有一個根元素,然後爲每個方法調用傳遞一個巨大的對象。 – Dave 2009-12-10 20:37:34

+0

我不認爲你必須繞過這個巨大的物體。你將不得不通過unmarshalled對象圖,並找到實際存在的東西並返回。很高興聽到你有一個解決方案,但。 – 2009-12-10 21:04:06

回答

0

我很感謝您的見解。你們都給了我很多好的信息,並且我沒有新的知識。最後,我通過黑客手段獲得了該流程。我抓住文本流,解析出消息的根標籤,然後打開它以確定要創建的正確對象。我獨立解組所有對象,每個人都爲我們的結局感到高興。

2

您是對的,Castor需要一個靜態映射。但你可以用它來工作。你可以編寫一些代碼來修改傳入的xml,這樣,就你而言,Castor可以使用一種模式,並且在客戶端,他們不必改變他們的模式。

更改Castor希望獲得某個具有共同根元素的模式,並在此之下爲您的不同對象提供九種不同的替代方案(我認爲您可以對其進行限制,以使架構僅允許九個中的一個,如果這不起作用,你可以使所有的子元素可選)。

然後,您可以編寫代碼來修改傳入的xml,以便使用該公共根元素包裝傳入的xml,然後將包裝的xml提供給Castor解組器所讀取的流。至少有三種不同的方式來實現xml包裝部分:SAX,XSLT和XML庫(如JDOM,DOM4J和XOM - 我更喜歡XOM,但其中任何一種都可以)。

如果您已經熟悉SAX或者其他方法之一已經工作但性能不佳,SAX方式可能是最好的。如果我必須實現它,那麼我將創建一個XMLFilter,它接受xml並將xml寫出,將另一個將xml寫入OutputStream的片段堆疊起來,然後編寫一個包裝器方法來解開傳入的流, xmlreader,將OutputStream複製到另一個InputStream(一種簡單的方法是使用commons-io),並將新的InputStream提供給Castor解組器。

有了XSLT,SAX並沒有欺騙,雖然XSLT有時會因疼痛而聲名狼借,但在我看來,這可能是一個相對簡單的轉換,但我也沒有采取過任何措施。自從我使用XSLT以來,很長一段時間。我也不確定表現如何,儘管我不會把它寫下來。

使用XOM或JDOM或DOM4J來包裝XML也是可能的,學習曲線比SAX或XSLT要低很多。不利的一面是整個XML文檔都會被一次性讀入內存,所以如果處理足夠大的文檔,可能會導致內存不足。

1

我在Jibx中有一個類似的東西,其中所有傳入的消息對象都實現了一個基本接口,它具有一個表示消息類型的字段。

將text/xml序列化爲基本接口,然後使用命令模式根據基本接口中定義的消息類型調用相應的業務邏輯。

不知道這是可能的使用腳輪,但看看Jibx的表現是太棒了。

http://jibx.sourceforge.net/

+0

我們使用castor來生成數據綁定的源代碼。我並沒有在數據綁定中看到我們正在做什麼的任何價值,並且如果這取決於我,我們只是使用XStream來序列化/反序列化對象。我以前用過它,並且非常滿意。但是,唉,軟件審批流程不允許像Jibx這樣的新型創新產品。事實上,我們使用舊版Castor的原因是:\ – Dave 2009-12-10 20:42:29