Apache flex 从Flex 3迁移到Flex 4.5:网络格式问题

Apache flex 从Flex 3迁移到Flex 4.5:网络格式问题,apache-flex,flex3,flex4,amf,charles-proxy,Apache Flex,Flex3,Flex4,Amf,Charles Proxy,我目前正在将一个大型项目从Flex3迁移到Flex4.5。我一直关注的问题是网络通信:我们使用的是嵌入在AMF3中的自定义协议,但flash.net.NetConnection发送的消息似乎不可读 我们的Java后端使用一些BlazeDS类来反序列化消息,即flex.messaging.io.amf.AmfMessageDeserializer.AmfMessageDeserializer,我可以使用解码AMF3的Charles Web Proxy监控网络流量。下面非常简单的代码发送一条消息,当

我目前正在将一个大型项目从Flex3迁移到Flex4.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:Unsupported AMF3 packet type 17 at 26”)

我已经在localhost:80上设置了一个apache服务器来测试这一点

是否有人在Flex 4.5中使用NetConnection并遇到反序列化问题?您是如何解决这些问题的

谢谢


Daniel

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


您使用的是哪个版本的Flash Player?

AMF3有一系列不同的核心类型可以序列化。其中一个核心类型是AMF3在过去一两年中新出现的,字典中有一个“数据包类型”我不确定为什么Flex 3会将其序列化为字典以外的其他类型,而Flex 4.5会将其序列化为新的字典类型,但是您会收到一个错误,因为BlazeDS后端不支持新的字典类型

解决方案是要么弄清楚它在Flex3中发送了什么,然后切换到Flex3,要么升级BlazeDS(似乎去年为Dictionary在BlazeDS中添加了一个补丁)


编辑:没有意识到错误发生在Charles身上。Charles可能没有添加对Dictionary的支持,因为它不是已记录的AMF3规范的一部分。您尝试过Charles的beta版吗?

我使用的是Flash player调试版本10.2.159.1。连接的objectEncoding等于3,我没有修改参数。在这种情况下,object编码应默认为AMF3。您的错误消息“不支持的AMF3数据包”使我确信这是编码问题。我看到错误消息源于“com.xk72.amf.AMFException”哪一个是Charles类对的?您有权访问该包中的代码吗?如果没有,您可能必须直接联系供应商。将objectEncoding更改为objectEncoding.AMF0使消息可读,并且我确实得到了响应,但响应者的结果和状态方法从未被调用。Flex 3.5中也是如此,从而打破了legacy code.elekwent:BlazeDS也无法读取该消息。我已尝试使用最新的BlazeDS版本(4.0.1.21287)重新编译后端。似乎这不是最新版本。我将尝试使用4.5.0.21329.+1来表示“Charles可能没有添加对字典的支持”阅读此问题后,我做的第一件事是查看Charles上次更新的时间:2010年8月。升级到BlazeDS 4.5和JRE 1.6确实解决了通信问题-我不得不稍微修改解析代码,因为Java端的对象类型不再是对象,而是哈希表。另一个有效的解决方案是将AS3对象作为参数传递给
调用
而不是字典-很容易实现,因为我们使用了从字典派生的类,所以我只需将其从对象派生即可(无论如何,我们从未使用过弱键)。
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");
}