public void EncodeArray(DxArrayValue value)
            {
                int arrlen = value.Count;

                if (arrlen < 16) //1001XXXX|    N objects
                {
                    databuffer.WriteByte((byte)((byte)MsgPackCode.CodeFixedArrayLow | (byte)arrlen));
                }
                else if (arrlen <= Max_map16_len)
                {
                    WriteUint16((ushort)arrlen, MsgPackCode.CodeArray16);
                }
                else
                {
                    if (arrlen > Max_map32_len)
                    {
                        arrlen = Max_map32_len;
                    }
                    WriteUint32((uint)arrlen, MsgPackCode.CodeArray32);
                }
                for (int i = 0; i < arrlen; i++)
                {
                    DxBaseValue vbase = value[i];
                    if (vbase == null)
                    {
                        databuffer.WriteByte((byte)MsgPackCode.CodeNil);
                    }
                    else
                    {
                        Encode(vbase);
                    }
                }
            }
            public void Encode(DxBaseValue value)
            {
                switch (value.Type)
                {
                case ValueType.VT_Map:
                    EncodeRecord((DxRecordValue)value);
                    break;

                case ValueType.VT_Array:
                    EncodeArray((DxArrayValue)value);
                    break;

                case ValueType.VT_Binary:
                    byte[] bt = ((DxBinaryValue)value).Bytes;
                    if (bt == null || bt.Length == 0)
                    {
                        databuffer.WriteByte((byte)MsgPackCode.CodeNil);
                    }
                    else
                    {
                        EncodeBinary(bt);
                    }
                    break;

                case ValueType.VT_Ext:
                    EncodeExtValue((DxExtValue)value);
                    break;

                case ValueType.VT_Boolean:
                    EncodeBool(value.AsBoolean);
                    break;

                case ValueType.VT_Int:
                case ValueType.VT_Int64:
                    EncodeInt(value.AsInt64);
                    break;

                case ValueType.VT_DateTime:
                    buf[0] = (byte)MsgPackCode.CodeFixExt4;
                    buf[1] = 0xff;
                    databuffer.Write(buf, 0, 2);
                    BigEndian.PutUint32(databuffer, (uint)((DxDateTimeValue)value).Unix);
                    break;

                case ValueType.VT_String:
                    EncodeString(value.AsString);
                    break;

                case ValueType.VT_Float:
                    EncodeFloat(value.AsFloat);
                    break;

                case ValueType.VT_Double:
                    EncodeDouble(value.AsDouble);
                    break;

                default:
                    databuffer.WriteByte((byte)MsgPackCode.CodeNil);
                    break;
                }
            }