在XML消息中收到的Java对象的反序列化问题

时间:2014-04-04 10:06:13

标签: java xml deserialization

我收到一条包含序列化Java对象的XML消息(通过HttpURLConnection)。这是收到的XML消息:

<?xml version="1.0" encoding="UTF-16"?><Olive><Responses><Character>aced0005737200116f626a656374732e43686172616374657200000000000000000200034c00056974656d737400154c6a6176612f7574696c2f41727261794c6973743b4c00086c6f636174696f6e7400124c6a6176612f6c616e672f537472696e673b4c00046e616d6571007e00027870737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a657870000000037704000000037400084954454d312d49447400084954454d322d49447400084954454d332d4944787400035858587400044a6f686e</Character></Responses></Olive>

我想要做的是反序列化<Character>元素中包含的Java对象。 (前四个字符“aced”表明我们正在处理序列化内容。到目前为止一直很好。)

我正在使用此代码来抓取<Character>中的字符并将它们反序列化为Java对象:

Node characterElement = responsesElementChildren.item(0);  // <Character>
String characterSerialized = characterElement.getTextContent();
ByteArrayInputStream bais = new ByteArrayInputStream( characterSerialized.getBytes() );
ObjectInputStream ins = new ObjectInputStream( bais );
objects.Character retrievedCharacter = (objects.Character) ins.readObject();

但是,上述操作失败,我得到了这个例外:

java.io.StreamCorruptedException: invalid stream header: 61636564
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at network.requests.RequestRetrieveCharacter.addResponse(RequestRetrieveCharacter.java:99)
    at network.GameServer.ask(GameServer.java:151)
    at Client.main(Client.java:43)

我无法判断收到的序列化数据是否正常,所以我真的不知道问题是在反序列化中还是实际在序列化中(在Java对象被序列化并打包到的发送端)一条XML消息)。

非常欢迎任何提示。

谢谢!

1 个答案:

答案 0 :(得分:0)

序列化java blob头部的幻数不是ascii字符串&#34; ACED&#34;,它是0xACED,后面是版本半字(此处:0x0005)。您在该xml中看到的内容看起来应该被解释为十六进制表示而不是ascii字符串。