/// <summary> /// 2byte - message length /// 2byte - message type /// 4byte - not use /// protobuf /// extern /// </summary> /// <param name="msg"></param> /// <param name="id"></param> /// <returns></returns> public ArraySegment <byte> Encode(object msg, out UInt16 id) { memoryStream.Seek(0, SeekOrigin.Begin); binaryWriter.Seek(0, SeekOrigin.Begin); binaryWriter.Write(UInt16.MinValue); UInt16 msgId = ClientProtocol.GetIdByType(msg.GetType()); #if net_log Debug.Log("encode id is :" + msgId); #endif id = msgId; binaryWriter.Write(msgId); binaryWriter.Write(UInt32.MinValue); RuntimeTypeModel.Default.Serialize(memoryStream, msg); #if net_log Debug.Log("encode after Serialize:" + memoryStream.Position); #endif int totalLength = (int)memoryStream.Position; UInt16 length = (UInt16)(memoryStream.Position - 2); binaryWriter.Seek(0, SeekOrigin.Begin); binaryWriter.Write(length); byte[] fullBuffer = new byte[totalLength]; Array.Copy(this.buffer, fullBuffer, totalLength); ArraySegment <byte> encodeResult = new ArraySegment <byte>(fullBuffer, 0, totalLength); return(encodeResult); }