我收到一条XML消息(通过HttpURLConnection),其中包含一个序列化的Java对象。这是接收到的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消息中)。
任何提示都非常受欢迎。
谢谢!
发布于 2016-11-22 23:41:44
序列化java blob开头的魔术数字不是ascii字符串"ACED",而是0xACED,后跟一个版本半字(这里: 0x0005)。您在该xml中看到的内容看起来应该被解释为十六进制表示,而不是ascii字符串。
https://stackoverflow.com/questions/22859722
复制相似问题