Example #1
0
    /// <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);
    }