首页 文章

脚轮和插座

提问于
浏览
1

我是Castor和数据绑定的新手 . 我正在开发一个应用程序,它部分地需要从套接字中取出数据并解组数据以生成POJO . 现在,我已经得到了套接字,我甚至生成并编译了java文件,这要归功于Ant和Castor .

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

有帮助吗?

3 回答

  • 2

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

    将Castor期望获得的模式更改为具有公共根元素的模式,并在其下面为您的不同对象提供九种不同的替代方案(我认为您可以对其进行限制,以便模式只允许九种中的一种,如果没有的话)找不到你可以让所有的子元素都可选) .

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

    实现xml-wrapping部分至少有3种不同的方法:SAX,XSLT和XML库(如JDOM,DOM4J和XOM - 我更喜欢XOM,但它们中的任何一个都可以工作) .

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

    使用XSLT并没有愚弄SAX,虽然XSLT有时会有痛苦的声誉,但在我看来,这可能是一个相对简单的转换,但我也没有采取过这种做法 . 自从我使用XSLT以来,已经有很长一段时间了 . 我也不确定性能,但我不会把它写下来 .

    使用XOM或JDOM或DOM4J来包装XML也是可能的,并且学习曲线比SAX或XSLT低很多 . 缺点是整个XML文档一下子就会被吸入内存,所以如果处理足够大的文档,你可能会耗尽内存 .

  • 1

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

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

    不确定这是否可以使用脚轮,但看看Jibx,因为性能太棒了 .

    http://jibx.sourceforge.net/

  • 0

    我很感激你的见解 . 你们两个都给了我一些很好的信息,以及我没有的新知识 . 最后,我通过黑客攻击了这个过程 . 我抓取文本流,解析出消息的根标签,然后打开它以确定要创建的正确对象 . 我独立解组了所有的物体,每个人都很高兴 .

相关问题