private void WriteMap(Stream ms)
        {
            byte b;

            byte[] lenBytes;
            int    len = children.Count;

            if (len <= 15)
            {
                b = (byte)(0x80 + (byte)len);
                ms.WriteByte(b);
            }
            else if (len <= 65535)
            {
                b = 0xDE;
                ms.WriteByte(b);

                lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len));
                ms.Write(lenBytes, 0, lenBytes.Length);
            }
            else
            {
                b = 0xDF;
                ms.WriteByte(b);
                lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len));
                ms.Write(lenBytes, 0, lenBytes.Length);
            }

            for (int i = 0; i < len; i++)
            {
                WriteTools.WriteString(ms, children[i].name);
                children[i].Encode2Stream(ms);
            }
        }
        public void Encode2Stream(Stream ms)
        {
            switch (this.valueType)
            {
            case MsgPackType.Unknown:
            case MsgPackType.Null:
                WriteTools.WriteNull(ms);
                break;

            case MsgPackType.String:
                WriteTools.WriteString(ms, (String)this.innerValue);
                break;

            case MsgPackType.Integer:
                WriteTools.WriteInteger(ms, (Int64)this.innerValue);
                break;

            case MsgPackType.UInt64:
                WriteTools.WriteUInt64(ms, (UInt64)this.innerValue);
                break;

            case MsgPackType.Boolean:
                WriteTools.WriteBoolean(ms, (Boolean)this.innerValue);
                break;

            case MsgPackType.Float:
                WriteTools.WriteFloat(ms, (Double)this.innerValue);
                break;

            case MsgPackType.Single:
                WriteTools.WriteFloat(ms, (Single)this.innerValue);
                break;

            case MsgPackType.DateTime:
                WriteTools.WriteInteger(ms, GetAsInteger());
                break;

            case MsgPackType.Binary:
                WriteTools.WriteBinary(ms, (byte[])this.innerValue);
                break;

            case MsgPackType.Map:
                WriteMap(ms);
                break;

            case MsgPackType.Array:
                WirteArray(ms);
                break;

            default:
                WriteTools.WriteNull(ms);
                break;
            }
        }