在XStream XML流中解释神秘的类名

时间:2015-06-04 02:10:00

标签: xstream

在通过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;和密切的标签,但我想明白。

我实际上并不关心在网上交换什么数据格式。班级名称是否存在对我来说并不重要。

1 个答案:

答案 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。