Java 向JMS发送XML时,我应该使用TextMessage还是ByteMessage

Java 向JMS发送XML时,我应该使用TextMessage还是ByteMessage,java,xml,serialization,character-encoding,jms,Java,Xml,Serialization,Character Encoding,Jms,我在web上发现了一些非常矛盾的信息,我认为每个不同的JMS提供者也可能会改变答案 我试图理解在将XML发送到JMS系统(例如ActiveMQ)时是否应该使用 BytesMessage:我可以保证XML被正确序列化,并且前导码将匹配实际编码。此外,我可以确保客户机能够正确获取原始表示 TextMessage:许多队列实现中都有API,可以轻松发送XML。我还了解到,邮件附带有“编码”信息。但我冒着用一种格式编码信息(并编写其前言)并将其作为另一种格式接收的风险 有没有人有明确的答案,或者至少

我在web上发现了一些非常矛盾的信息,我认为每个不同的JMS提供者也可能会改变答案

我试图理解在将XML发送到JMS系统(例如ActiveMQ)时是否应该使用

  • BytesMessage:我可以保证XML被正确序列化,并且前导码将匹配实际编码。此外,我可以确保客户机能够正确获取原始表示

  • TextMessage:许多队列实现中都有API,可以轻松发送XML。我还了解到,邮件附带有“编码”信息。但我冒着用一种格式编码信息(并编写其前言)并将其作为另一种格式接收的风险

有没有人有明确的答案,或者至少有一些理由让你选择其中一个而不是另一个

我同意对你问题的评论。首先,您应该选择最能表达内容语义的消息类型。阅读Javadoc,我会这样做:

此消息类型可用于传输基于文本的消息,包括包含XML内容的消息

因此,如果您确实在文本消息编码方面遇到问题,那么可能是客户机/服务器端的一些配置错误。但这不应该成为滥用不同消息类型的动机,这些消息类型主要不是用于文本传输的,例如

注意:即使使用
BytesMessage
,您也可能会得到错误的编码。想象一下:

// Send that data through JMS
byte[] data1 = "source text".getBytes("ISO-8859-1");

// Receive the byte stream on the other side. Ooops
String data2 = new String(data1, "UTF-8");

没有明确的答案,抱歉,伙计。我的2cts:XML是一种文本格式,因此,请使用TextMessage。如果您要发送二进制数据,比如zip或jpg,-然后-使用BytesMessage。让东西自己有意义(没有文档)。它让(开发人员/测试人员/维护人员)的生活更轻松。试着为一个防御项目工作,并告诉你的经理“我们不会为了让它更轻松而记录它…”。我还是明白你的意思。Base64编码的UTF8并不太糟糕,不必求助于MTOM.True之类的东西,但是我在.Net中使用的库将在给定数据流的情况下查找字节顺序标记并正确识别编码。另外,我的xml有序言。但我听到的是,陪审团已经出局了。有趣的是(我目前正在处理一个类似的类型问题)——在Java8中,代码片段可以工作:data1=”[B@3d4eac69“和data2=“源文本”,这是原始文本。