java - 脚轮和 socket

标签 java xml-serialization sockets castor xml-binding

我对 Castor 和数据绑定(bind)总体来说是新手。我正在开发一个应用程序,该应用程序部分需要从套接字中取出数据并解码数据以生成 POJO。现在,我已经搞定了套接字的内容,而且借助 Ant 和 Castor,我什至还生成并编译了 java 文件。

问题是:我将收到的数据流可能是大约 9 个不同对象之一。也就是说,我收到一个文本流 (XML),它表示一个包含我要操作的内容的对象;再次,取决于对象类型。如果它只是一个对象,那就很容易了:对其调用 unmarshall 命令并继续我的快乐之路。但是,由于它可能是多种对象之一,我谁知道要解码什么?我阅读了有关映射的内容,但要么我没有明白,要么它看起来像是静态映射,而不是动态映射。

有什么帮助吗?

最佳答案

你是对的,Castor 期望静态映射。但你可以用它。您可以编写一些代码来修改传入的 xml,以便在您这边,Castor 可以使用一种架构,而在您的客户端,他们不必更改其架构。

更改 Castor 期望获得具有公共(public)根元素的模式,在该模式下为不同对象提供九种不同的替代方案(我认为您可以限制它,因此模式将只允许九种中的一种,如果这不起作用,您可以将所有子元素设为可选)。

然后,您可以编写代码来修改传入的 xml,以使用该公共(public)根元素包装传入的 xml,然后将包装的 xml 提供到由 Castor 解码器读取的流中。

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

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

对于 XSLT,SAX 是无法愚弄的,尽管 XSLT 有时会带来痛苦,但在我看来,这可能是一个相对简单的转换,但我也没有尝试过。我已经很长时间没有使用 XSLT 来做任何事情了。我也不确定性能,但我不会立即将其注销。

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

关于java - 脚轮和 socket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1759540/

相关文章:

C# 如何从数据库中填充使用 XSD.EXE 创建的类

java - 从套接字输入流读取

python - 将数据从套接字绘制到 TKinter 时,pickle 出现 EOFError

Android 持久套接字连接规则

java - jsTree,刷新时需要展开所有节点

java - 如何以供应商中立的方式使用 JPA?

java - Node.getTextContent() 有没有办法获取当前节点的文本内容,而不是后代的文本

java - servlet 检查参数

c# - 如何在 C# 中序列化/反序列化可选的 XML 枚举?

asp.net - 为什么 MSBuild 将 *.XmlSerializers.dll 程序集放在已发布的 Web 应用程序的根文件夹中?