一、官方文檔注解如下:
public function readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
Reads the number of data bytes, specified by the length parameter, from the byte stream. The bytes are read into the ByteArray object specified by the bytes parameter, and the bytes are written into the destination ByteArray starting at the position specified by offset.
Parameters
bytes:ByteArray — The ByteArray object to read data into.
offset:uint (default = 0) — The offset (position) in bytes at which the read data should be written.
length:uint (default = 0) — The number of bytes to read. The default value of 0 causes all available data to be read.
二、參數注意
第3個參數length,如果傳0表示將ByteArray里的剩余數據全部讀進bytes里,與通常的API理解不一致。
這點有點怪異,我的程序里,ByteArray類型的buff需要從ByteArray類型的recvBuff里讀取給定數量的字節數。字節數有可能是0(protobuf里,如果全為optional字段,并且沒有設定值,這個protobuf協議序列化的結果就是0字節),企圖用recvBuff.readBytes(buff, 0, 0)來讀取零字節是不能達到目的的。
recvBuff里還有其他的網絡包數據,如果用readBytes(buff, 0, 0)會把recvBuff里其他網絡包的數據讀給了當前buff,然后交給當前包對應的protobuf類來反序列化,就錯了。
癥狀如下,方便大家搜索到此文:
Bad data format: **.** cannot be set twice.
invalid nested message
message length = 1
注:as3, protobuf-gen-as3(http://code.google.com/p/protoc-gen-as3/)
ps:2012年9月19日我在CU上的博文