在通过RabbitMQ发送数据时,我使用XStream 1.4.8来串行化XML。在某些情况下,类名称会添加到生成的XML中,从而中断反序列化。我要解释的最困难的问题是,在生产中,某个XML值不会产生异常,而在dev中,我会得到一个异常。
严重序列化的XML:
<company.events.twitter.InteractionReceivedFromTwitter4>
<header>
<id serialization="custom">
<com.eaio.uuid.UUID>
<long>4426172843343876581</long>
<long>-7002731889965487449</long>
</com.eaio.uuid.UUID>
</id>
<date>1433342326156</date>
<data class="scala.collection.immutable.Map$EmptyMap$"/>
</header>
<!-- more data fields -->
</company.events.twitter.InteractionReceivedFromTwitter4>
此XML无法序列化,但 是从XStream 1.4.8生成的。如果我编辑XML并删除<com.eaio.uuid.UUID>
和相应的结束标记(只是标记)并保留内容,则XML将正确反序列化。
我想了解添加此额外符号的方式和原因。我用来序列化和反序列化的代码:
class XStreamSerializer extends Serializer {
private val xstream = new XStream
def serialize(x: AnyRef) = xstream.toXML(x).getBytes
def deserialize(data: Array[Byte], contentType: String) = {
if (contentType != serializationContentType)
throw new IllegalArgumentException("Can only decode " + serializationContentType + ", received " + contentType)
val res = xstream.fromXML(new ByteArrayInputStream(data))
Option(res)
}
def serializationContentType = "application/xml;charset=utf-8"
}
case class MessageHeader( id: UUID, date: Long, data: Map[String, String])
case class InteractionReceivedFromTwitter4(header: MessageHeader,
correlationId: UUID,
interaction: InteractionMessage,
persona: InteractionPersona)
在开发过程中,我从未看到过额外的课程提及。我可以修理&#34;通过删除字符串&#34;&#34;和密切的标签,但我想明白。
我实际上并不关心在网上交换什么数据格式。班级名称是否存在对我来说并不重要。
答案 0 :(得分:0)
我设法追查这个问题。我在反序列化方面使用Scala 2.9.0.1,在序列化方面使用Scala 2.11.4。 Scala 2.11生成的Java对象在结构上与Scala 2.9.0.1 Java对象不同,后者应解释其差异。
我还追踪了我使用的UUID库中的差异,反序列化方面的3.4,序列化方面的3.2。