下面的代码十分困惑:
var re:URLRequest = new URLRequest("http://www.***.com");
re.method = URLRequestMethod.POST;
var byte:ByteArray = new ByteArray();
byte.writeUTF("hi");
byte.writeUTF("why");
byte.writeInt(1);
var obj:Object = {};
obj.a = 1;
obj.b = "hi";
byte.writeObject(obj);
re.data = byte;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(re);
按预测,URLRequest在post ByteArray数据时会按照其默认编码(AMF3)序列化,但事实情况是,只有代码中Object对应的字段被准确序列化,而int,String等值对象被序列化后掩码错误。上述代码抓包数据:
数据中的"|"为我加入的分格符号。可以看出,String被序列化后由长度+正文组成,但是掩码(marker)是文档中定义的undefined-marker(int的掩码也被错误的写为0x00),即0x00.唯独Object的掩码是正常的0x0A,并且其属性a与b的值的掩码是均是正确的0x04与0x06.
不解?...
var re:URLRequest = new URLRequest("http://www.***.com");
re.method = URLRequestMethod.POST;
var byte:ByteArray = new ByteArray();
byte.writeUTF("hi");
byte.writeUTF("why");
byte.writeInt(1);
var obj:Object = {};
obj.a = 1;
obj.b = "hi";
byte.writeObject(obj);
re.data = byte;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(re);
按预测,URLRequest在post ByteArray数据时会按照其默认编码(AMF3)序列化,但事实情况是,只有代码中Object对应的字段被准确序列化,而int,String等值对象被序列化后掩码错误。上述代码抓包数据:
00 02 68 69 | 00 03 77 68 | 79 00 00 00 | 01 0A 0B 01 | 03 61 04 01 | 03 62 06 05 | 68 69 01
数据中的"|"为我加入的分格符号。可以看出,String被序列化后由长度+正文组成,但是掩码(marker)是文档中定义的undefined-marker(int的掩码也被错误的写为0x00),即0x00.唯独Object的掩码是正常的0x0A,并且其属性a与b的值的掩码是均是正确的0x04与0x06.
不解?...



可以这样理解:URLRequest不知道AMF的存在,不管你要传递什么东西,我只是纯物理的传递过去,我不做任何检测或解析
OK,再说下ByteArray,ByteArray本身是操作字节的东西,也不管AMF,只是Adobe为了方便,多给了writeObject,readObject方法来方便的应用AMF协议
writeObject () 方法
public function writeObject(object:*):void
语言版本: ActionScript 3.0
运行时版本: AIR 1.0, Flash Player 9
将对象以 AMF 序列化格式写入字节数组。
ByteArray in URLRequest,并没有做任何序列化工作。刚好你使用了采用AMF3协议的writeObject()方法。
我们可以自己实现对 AS3 对象序列化,而不使用AMF3。而摆在眼前的事实就是,你使用的writeObject()是采用AMF3的。而其它方法(writeUTF、writeInt...)只是纯粹地把数据写进 ByteArray 而不采用任何序列化协议。
.......
如果你想统一协议,你可以尝试这样做:
var byte:ByteArray = new ByteArray();
byte.writeObject("hi");
byte.writeObject("why");
byte.writeObject(1);
var obj:Object = {};
obj.a = 1;
obj.b = "hi";
byte.writeObject(obj);
就是统一用 writeObject() 方法。这样,全部都是AMF3了,而不会出现你的情况。
writeObject() 方法是按AMF3序列化的,而其它则都是纯字节。
通过HTTP传输ByteArray,可以实现上传的效果,我一直都这样来上传文件的。