3

我目前正在将一个大型项目从 Flex 3 迁移到 Flex 4.5。我遇到的问题是网络通信:我们使用的是嵌入在 AMF3 中的自定义协议,但 flash.net.NetConnection 发送的消息似乎不可读。

我们的 Java 后端使用一些 BlazeDS 类来反序列化消息,即 flex.messaging.io.amf.AmfMessageDeserializer.AmfMessageDeserializer,我可以使用解码 AMF3 的 Charles Web Proxy 监控网络流量。下面的非常简单的代码发送一条消息,当在 Flex 3.5 中编译时,Charles 可以解码,但在 Flex 4.5 中不可以(我收到“无法解析数据(com.xk72.amf.AMFException:不支持的 AMF3 数据包类型 17 在 26”) )。

import mx.controls.Alert;

private function init():void
{
    var pdl : Dictionary = new Dictionary();

    var connection : NetConnection = new NetConnection();
    connection.connect("http://localhost");

    var responder : Responder = new Responder(result);
    connection.call("net", responder, pdl);
}

private function result(pdl : Object) : void {
    Alert.show("coucou", "hello");
}

我已经在 localhost:80 设置了一个 apache 服务器来测试它。

有没有人在 Flex 4.5 中使用过 NetConnection 并遇到反序列化问题?你是怎么解决的?

谢谢,

丹尼尔

4

2 回答 2

3

AMF3 有许多可以序列化的不同核心类型。其中一个核心类型是 AMF3 在过去一两年中新增的,即字典,它的“数据包类型”为 17,因此出现错误消息。我不确定为什么 Flex 3 会将其序列化为 Dictionary 以外的内容,而 Flex 4.5 会将其序列化为新的 Dictionary 类型,但您会遇到错误,因为您的 BlazeDS 后端不支持新的 Dictionary 类型。

解决方案是要么弄清楚它在 Flex 3 中发送的内容并切换到那个,要么升级 BlazeDS(去年似乎为 BlazeDS 添加了一个补丁用于字典http://forums.adobe.com/thread /684487)。

编辑:没有意识到查尔斯的错误。Charles 可能没有添加对 Dictionary 的支持,因为它不是记录在案的 AMF3 规范的一部分。你试过查尔斯的测试版吗?

于 2011-06-03T15:54:06.583 回答
0

由于您使用的是旧代码,因此您可能需要在建立连接之前手动设置 NetConnection 的objectEncoding属性。您可以在ObjectEncoding类的帮助下设置连接的 objectEncoding 。

您使用的是什么版本的 Flash Player?

于 2011-06-03T15:01:08.860 回答