我正在使用 Flash 工具将数据传输到 Java。我在一次发送多个对象时遇到问题。发送的对象只是通用的 Object 对象,因此不需要注册类别名或任何其他内容。
发送一个对象效果很好。一旦我开始发送多个对象(将相同的对象放入数组中并发送),它就开始变得奇怪。数组中最多三个对象似乎工作正常。不仅如此,我在 readObject()
函数中遇到了不同的错误,例如:
- 未知 AMF 类型“47”
- 未知 AMF 类型“40”
- 未知 AMF 类型“20”
- OutOfBoundsExceptions 索引 23,大小 0
- 空指针异常
- 等等
发送 3 个对象会起作用,发送 4 个对象会出现错误。如果我删除前三个有效的之一(同时保留添加的第四个),它会再次工作。有人知道这是怎么回事吗?
更多信息:
- 通信通过 Flash 端的 Socket 类进行。这是纯 AS3,没有 Flex。
- 消息在发送之前会被压缩并在服务器上解压缩,因此我很确定这不是缓冲区大小问题(除非我遗漏了某些内容)
- jar 上的 BlazeDS 版本似乎是 4.0.0.14931
- Flash 版本为 10.1(它是一个 AIR 应用程序)
使用粗略代码更新
发送对象的示例:
var o:Object = { };
o._key = this._key.toString();
o.someParam = someString;
o.someParam2 = someInt;
o.someParam3 = [someString1, someString2, someString3];
...
它被添加到我们的事件对象中(我们用它来确定要调用的事件、要传递的数据等)。事件对象已注册为类别名
该对象通过 Socket 发送到服务器,如下所示:
myByteArray.writeObject( eventObj );
myByteArray.compress();
mySocket.writeBytes( myByteArray );
mySocket.flush();
在服务器端,我们接收字节并解压缩它们。我们创建一个 Amf3Input 对象并设置输入流,然后读取它:
Amf3Input amf3Input = new Amf3Input( mySerializationContext );
amf3Input.setInputStream( new ByteArrayInputStream( buffer ) ); // buffer is a byte[]
MyEventObj eventObj = (MyEventObj)amf3Input.readObject(); // MyEventObj is the server version of the client event object
如果它因“未知的 AMF 类型错误”而崩溃,它会立即崩溃,即当我们尝试读取对象时,而不是当它尝试读取子对象时。
在单步执行读取代码时,似乎当我传递一个对象数组时,如果长度<= 4,它会正确读取长度。如果长度大于该长度,则读取长度为 4。
最佳答案
如果您遇到 AMF 反序列化错误,则可能有多种问题会导致该问题。以下是进行进一步诊断的几种技术:
使用网络流量嗅探器确保您发送的内容与您接收的内容匹配。在 Mac 上我将使用 CocoaPacketAnalyzer ,或者您可以尝试Charles ,它实际上可以解码它注意到的 AMF 数据包。
将数据输入到不同的 AMF 库,例如 PyAMF或RocketAMF看看这是否是 BlazeDS 的问题或您如何调用它的问题。您也可能会收到不同的错误消息,这将使您更好地了解失败的位置。
检查AMF数据包的格式。 AMF 服务器调用有一些额外的包装,如果反序列化器不希望遇到这种包装,则会抛出该包装,对于纯序列化对象反之亦然。服务器调用数据包始终以
0x00
开头,后跟 AMF 版本(0x00
、0x03
,或在极少数情况下0x02
)。
关于java - 将文件从闪存传输到 java 时出现未知的 AMF 类型和其他错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7997156/