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

3
我目前正在将一个大型项目从Flex 3迁移到Flex 4.5。我遇到的问题是网络通信:我们使用的是嵌入在AMF3中的自定义协议,但似乎flash.net.NetConnection发送的消息无法读取。
我们的Java后端使用一些BlazeDS类来反序列化消息,即flex.messaging.io.amf.AmfMessageDeserializer.AmfMessageDeserializer,并且我可以用Charles Web Proxy监视网络流量并解码AMF3。下面这个非常简单的代码可以在Flex 3.5中编译时发送可由Charles解码的消息,但在Flex 4.5中无法解码(我得到“Failed to parse data (com.xk72.amf.AMFException: Unsupported AMF3 packet type 17 at 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");
}

我在本地设置了一个apache服务器来进行测试,端口是localhost:80。
有人在Flex 4.5中使用NetConnection时遇到过反序列化问题吗?你们是如何解决的?
谢谢,
Daniel
2个回答

3
AMF3可以序列化许多不同的核心类型。其中之一是最近一两年才引入AMF3的Dictionary,它的“数据包类型”为17,因此出现了错误消息。我不确定为什么Flex 3将其序列化为除Dictionary以外的其他内容,而Flex 4.5会将其序列化为新的Dictionary类型,但您出现错误是因为BlazeDS后端不支持新的Dictionary类型。
解决方案要么找出Flex 3发送的内容并切换到该内容,要么升级BlazeDS(去年似乎为Dictionary添加了补丁:http://forums.adobe.com/thread/684487)。
编辑:没有意识到错误是由Charles引起的。Charles可能还没有为Dictionary添加支持,因为它不是文档化的AMF3规范的一部分。您尝试过Charles的beta版本吗?

1
“Charles可能还没有为Dictionary添加支持”,这句话的意思是加1。在阅读这个问题后,我做的第一件事就是查看Charles上次更新的时间:2010年8月。 - elekwent
升级到BlazeDS 4.5和JRE 1.6确实解决了通信问题 - 我不得不稍微修改解析代码,因为Java端的对象类型不再是ASObject而是Hashtable。另一个有效的解决方案是将AS3对象作为参数传递给call,而不是字典 - 这很容易实现,因为我们使用了从字典派生的类,我只需要让它从对象派生而来(我们从未使用过弱键)。 - Daniel Kitachewsky

0

由于您正在使用遗留代码,因此在建立连接之前,您可能需要手动设置NetConnection的objectEncoding属性。您可以借助ObjectEncoding类来设置连接的objectEncoding。

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


我正在使用Flash播放器调试版本10.2.159.1。连接的objectEncoding等于3,我没有修改参数。 - Daniel Kitachewsky
在这种情况下,对象编码应默认为AMF3。您的错误消息“不支持的AMF3数据包”让我相信这是一个编码问题。我看到错误消息来自“com.xk72.amf.AMFException”,这是Charles类对吧?您是否可以访问该软件包中的代码?如果不能,您可能需要直接联系供应商。 - elekwent
将 objectEncoding 更改为 ObjectEncoding.AMF0 可以使消息可读,并且我确实收到响应,但是 Responder 的 result 和 status 方法从未被调用。这也适用于 Flex 3.5,从而破坏了旧代码。 - Daniel Kitachewsky
elekwent: 这个消息在 BlazeDS 中也无法读取。我尝试使用最新的 BlazeDS 版本(4.0.1.21287)重新编译后端。 - Daniel Kitachewsky
似乎这不是最新版本。我将尝试使用4.5.0.21329。 - Daniel Kitachewsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接