Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML消息中接收到的Java对象的反序列化问题_Java_Xml_Deserialization - Fatal编程技术网

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

XML消息中接收到的Java对象的反序列化问题,java,xml,deserialization,Java,Xml,Deserialization,我收到一条包含序列化Java对象的XML消息(通过HttpURLConnection)。这是收到的XML消息: <?xml version="1.0" encoding="UTF-16"?><Olive><Responses><Character>aced0005737200116f626a656374732e43686172616374657200000000000000000200034c00056974656d737400154c6a6176

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

<?xml version="1.0" encoding="UTF-16"?><Olive><Responses><Character>aced0005737200116f626a656374732e43686172616374657200000000000000000200034c00056974656d737400154c6a6176612f7574696c2f41727261794c6973743b4c00086c6f636174696f6e7400124c6a6176612f6c616e672f537472696e673b4c00046e616d6571007e00027870737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a657870000000037704000000037400084954454d312d49447400084954454d322d49447400084954454d332d4944787400035858587400044a6f686e</Character></Responses></Olive>
ACED005737200116F626A656374732E4368617261637465720000000000034C00056974656D737400154C6A6176612F7574696C2F417261794C6973743B4C0086C6F636174696F6E7400124C6A6176766C616E6772F53742696E673B4C0046E67116D6571007E0002787073720013616A6612E7574696C2E47726179787878787D2997000197019D67070707070707019554454D312D494447400084954454D322D494447400084954454D332D4944874000358587400044A6F686E
我想做的是反序列化
元素中包含的Java对象。(前四个字符“aced”表明我们正在处理序列化内容。到目前为止还不错。)

我使用这段代码获取
中的字符,并将它们反序列化为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();
Node characterElement=responseElementChildren.item(0);//
String characterSerialized=characterElement.getTextContent();
ByteArrayInputStream bais=新的ByteArrayInputStream(characterSerialized.getBytes());
ObjectInputStream ins=新ObjectInputStream(BAI);
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.io.StreamCorruptedException:无效的流头:61636564
位于java.io.ObjectInputStream.readStreamHeader(未知源)
位于java.io.ObjectInputStream。(未知源)
位于network.requests.RequestRetrieveCharacter.addResponse(RequestRetrieveCharacter.java:99)
在network.GameServer.ask(GameServer.java:151)
位于Client.main(Client.java:43)
我无法判断收到的序列化数据是否正常,因此我真的不知道问题是在反序列化中还是在序列化中(在Java对象被序列化并打包到XML消息的发送端)

欢迎任何提示


谢谢

序列化java blob开头的神奇数字不是ascii字符串“ACED”,而是0xACED,后跟版本半字(此处:0x0005)。您在该xml中看到的内容看起来应该解释为十六进制表示,而不是ascii字符串。

输入流已损坏,这就是原因!检查它为什么会被损坏。@章鱼这很可能是真的,但我怎么知道呢?无效的流头61636564对我来说似乎没问题,因为它对应于ASCII中的“aced”,这反过来意味着流魔法(根据本页:)。在别处找到了答案。我会把它放在这里以备将来参考。问题出在getBytes中,因为它分别读取每个字符并将其分配给一个字节。相反,一个字符(十六进制值为0-A)应进入4位(半字节)。最后使用了这个解决方案:
ByteArrayInputStream bais=newbytearrayinputstream(DatatypeConverter.parseHexBinary(characterSerialized))