1

我是 Castor 和数据绑定的新手。我正在开发一个应用程序,该应用程序部分需要从套接字中取出数据并解组数据以制作 POJO。现在,由于 Ant 和 Castor,我已经完成了套接字的工作,甚至生成并编译了 java 文件。

这就是问题所在:我将收到的数据流可能是大约 9 个不同的对象之一。也就是说,我收到一个文本流 (XML),它代表一个包含我将要操作的东西的对象;再次,取决于对象类型。如果它只是一个对象,那很容易:调用它的 unmarshall 命令并继续我的快乐方式。但是,既然它可能是多种对象中的一种,我知道要解组什么吗?我阅读了映射,但要么我没有得到它,要么它看起来像是静态映射,而不是动态映射。

有什么帮助吗?

4

3 回答 3

2

你是对的,Castor 需要一个静态映射。但是你可以使用它。您可以编写一些代码来修改传入的 xml,以便在您这边,Castor 可以使用一个模式,而在您的客户端方面,他们不必更改他们的模式。

更改 Castor 期望得到的具有共同根元素的模式,在此之下,您可以为不同的对象提供九种不同的替代方案(我认为您可以限制它,因此该模式将只允许九种中的一种,如果没有的话) t 工作你可以只使所有子元素可选)。

然后,您可以编写代码来修改传入的 xml 以使用该公共根元素包装传入的 xml,然后将包装的 xml 提供给 Castor unmarshaller 读取的流。

至少有 3 种不同的方式来实现 xml 包装部分:SAX、XSLT 和 XML 库(如 JDOM、DOM4J 和 XOM——我更喜欢 XOM,但它们中的任何一个都可以)。

如果您已经熟悉 SAX,或者如果其他方法之一有效但性能不足,则 SAX 方法可能是最好的。如果我必须实现它,那么我将创建一个接收 xml 并将 xml 写出的 XMLFilter,将其堆叠在另一个将 xml 写入 OutputStream 的部分之上,并围绕解组的内容编写一个包装器方法以将传入的流提供给xmlreader,将 OutputStream 复制到另一个 InputStream(一种简单的方法是使用 commons-io),并将新的 InputStream 提供给 Castor unmarshaller。

有了 XSLT,就不会和 SAX 开玩笑了,虽然 XSLT 有时以痛苦着称,但在我看来,这可能是一个相对简单的转换,但我也没有尝试过。很久没有使用 XSLT 做任何事情了。我也不确定性能,尽管我不会一概而论。

使用 XOM 或 JDOM 或 DOM4J 来包装 XML 也是可能的,并且学习曲线比 SAX 或 XSLT 低很多。缺点是整个 XML 文档往往会立即被吸入内存,因此如果您处理足够大的文档,您可能会耗尽内存。

于 2009-11-24T14:37:37.423 回答
1

我在 Jibx 中有一个类似的东西,所有传入的消息对象都实现了一个基本接口,该接口具有一个表示消息类型的字段。

text/xml 被序列化到基本接口中,然后我使用命令模式根据基本接口中定义的消息类型调用相应的业务逻辑。

不确定这是否可以使用 castor,但请看一下 Jibx,因为它的性能非常棒。

http://jibx.sourceforge.net/

于 2009-11-25T12:45:49.763 回答
0

我很欣赏你的见解。你们都给了我一些很好的信息和我没有的新知识。最后,我通过 hack 获得了这个过程。我抓取文本流,解析出消息的根标签,然后打开它以确定要创建的正确对象。我正在独立解组我的所有对象,每个人都对我们感到高兴。

于 2009-12-10T20:40:04.090 回答