public override void Write(TypeInfo info, BinaryWriter buffer, object value, BinaryJSONWriter binaryJsonWriter)
 {
     buffer.Write(BinaryValue.ENUM);
     var result = Convert.ChangeType(value, info.EnumUnderlyingType);
     var infoType = info.TypeDescriptions.GetType(info.EnumUnderlyingType);
     binaryJsonWriter.Write(infoType, result, buffer);
 }
        public TypeDescription()
        {
            _nullTypeInfo = new TypeInfo(this, null);

            _serializations[(int)TypeValue.Primitive] = new PrimitiveSerialization();
            _serializations[(int)TypeValue.Null] = new NullSerialization();
            _serializations[(int)TypeValue.String] = new StringSerialization();
            _serializations[(int)TypeValue.Object] = new ObjectSerialization();
            _serializations[(int)TypeValue.Array] = new ArraySerialization();
            _serializations[(int)TypeValue.List] = new ArraySerialization();
            _serializations[(int)TypeValue.Dictionary] = new DictionarySerialization();
            _serializations[(int)TypeValue.Enum] = new EnumSerialization();

            _binaryValue.Add(typeof(bool), BinaryValue.BOOLEAN);
            _binaryValue.Add(typeof(byte), BinaryValue.BYTE);
            _binaryValue.Add(typeof(sbyte), BinaryValue.SBYTE);
            _binaryValue.Add(typeof(Int16), BinaryValue.INT16);
            _binaryValue.Add(typeof(UInt16), BinaryValue.UINT16);
            _binaryValue.Add(typeof(Int32), BinaryValue.INT32);
            _binaryValue.Add(typeof(UInt32), BinaryValue.UINT32);
            _binaryValue.Add(typeof(Int64), BinaryValue.INT64);
            _binaryValue.Add(typeof(UInt64), BinaryValue.UINT64);
            _binaryValue.Add(typeof(float), BinaryValue.FLOAT);
            _binaryValue.Add(typeof(Decimal), BinaryValue.DECIMAL);
            _binaryValue.Add(typeof(Char), BinaryValue.CHAR);
            _binaryValue.Add(typeof(Double), BinaryValue.DOUBLE);
            _binaryValue.Add(typeof(String), BinaryValue.STRING);
        }
        public override void Write(TypeInfo info, BinaryWriter buffer, object value, BinaryJSONWriter binaryJsonWriter)
        {
            if (value == null)
            {
                buffer.Write(BinaryValue.NULL);
            }
            else
            {
                buffer.Write(BinaryValue.DICTIONARY);
                var dictionary = (IDictionary)value;
                var count = dictionary.Count;
                buffer.Write((int)count);

                var keyType = dictionary.GetType().GetGenericArguments()[0];
                if (keyType.IsEnum) keyType = Enum.GetUnderlyingType(keyType);
                var code = info.TypeDescriptions.GetCodeByPrimitiveType(keyType);
                buffer.Write(code);

                foreach (var key in dictionary.Keys)
                {
                    WriteField(key, buffer, code);
                    var keyValue = dictionary[key];
                    binaryJsonWriter.Write(keyValue, buffer);
                }
            }
        }
 public override void Write(TypeInfo info, BinaryWriter buffer, object value, BinaryJSONWriter binaryJsonWriter)
 {
     if (value == null)
     {
         buffer.Write(BinaryValue.NULL);
     }
     else
     {
         buffer.Write(BinaryValue.STRING);
         var bytes = Encoding.UTF8.GetBytes((string)value);
         buffer.Write((int)bytes.Length);
         buffer.Write(bytes);
     }
 }
 public override void Write(TypeInfo info, BinaryWriter buffer, object value, BinaryJSONWriter binaryJsonWriter)
 {
     if (value == null)
     {
         buffer.Write(BinaryValue.NULL);
     }
     else
     {
         buffer.Write(BinaryValue.OBJECT);
         buffer.Write((int)info.Fields.Length);
         foreach (var field in info.Fields)
         {
             WriteField(buffer, field.Name);
             var typeInfo = info.TypeDescriptions.GetType(field.FieldType);
             binaryJsonWriter.Write(typeInfo, field.GetValue(value), buffer);
         }
     }
 }
        public override void Write(TypeInfo info, BinaryWriter buffer, object value, BinaryJSONWriter binaryJsonWriter)
        {
            if (value == null)
            {
                buffer.Write(BinaryValue.NULL);
            }
            else
            {
                var arr = value as Array;
                IEnumerable enumerable = null;
                int count = 0;
                if (arr != null)
                {
                    count = arr.Length;
                    enumerable = arr;
                }
                else
                {
                    var coll = value as IList;
                    if (coll != null)
                    {
                        enumerable = coll;
                        count = coll.Count;
                    }
                }
                if (enumerable != null)
                {
                    buffer.Write(BinaryValue.ARRAY);
                    buffer.Write((int)count);

                    foreach (var item in enumerable)
                    {
                        binaryJsonWriter.Write(item, buffer);
                    }
                }
            }
        }
 internal void Write(TypeInfo info, object value, BinaryWriter buffer)
 {
     _typeDescriptor.Get(info).Write(info, buffer, value, this);
 }
 public override void Write(TypeInfo info, BinaryWriter buffer, object value, BinaryJSONWriter binaryJsonWriter)
 {
     buffer.Write(BinaryValue.NULL);
 }
 public virtual void Write(TypeInfo info, BinaryWriter buffer, object value, BinaryJSONWriter binaryJsonWriter)
 {
 }
 public TypeInfo GetType(Type type)
 {
     if (type == null) return _nullTypeInfo;
     TypeInfo result;
     if (!_descriptions.TryGetValue(type, out result))
     {
         result = new TypeInfo(this, type);
         _descriptions.Add(type, result);
     }
     return result;
 }
 public TypeSerialization Get(TypeInfo info)
 {
     return _serializations[(int)info.TypeValue];
 }
 public override void Write(TypeInfo info, BinaryWriter buffer, object value, BinaryJSONWriter binaryJsonWriter)
 {
     var type = info.Type;
     if (type == TypeInfo.Int32)
     {
         int i = (int) value;
         if (i <= byte.MaxValue && i >= byte.MinValue)
         {
             buffer.Write(BinaryValue.BYTE);
             buffer.Write((byte)i);
         }
         else if (i <= sbyte.MaxValue && i >= sbyte.MinValue)
         {
             buffer.Write(BinaryValue.SBYTE);
             buffer.Write((sbyte)i);
         }
         else if (i <= Int16.MaxValue && i >= Int16.MinValue)
         {
             buffer.Write(BinaryValue.INT16);
             buffer.Write((Int16)i);
         }
         else if (i <= UInt16.MaxValue && i >= UInt16.MinValue)
         {
             buffer.Write(BinaryValue.UINT16);
             buffer.Write((UInt16)i);
         }
         else
         {
             buffer.Write(BinaryValue.INT32);
             buffer.Write(i);
         }
     }
     else if (type == TypeInfo.Float)
     {
         buffer.Write(BinaryValue.FLOAT);
         buffer.Write((float)value);
     }
     else if (type == TypeInfo.Bool)
     {
         buffer.Write(BinaryValue.BOOLEAN);
         buffer.Write((bool)value);
     }
     else if (type == TypeInfo.Double)
     {
         buffer.Write(BinaryValue.DOUBLE);
         buffer.Write((double)value);
     }
     else if (type == TypeInfo.Int16)
     {
         Int16 i = (Int16)value;
         if (i <= byte.MaxValue && i >= byte.MinValue)
         {
             buffer.Write(BinaryValue.BYTE);
             buffer.Write((byte)i);
         }
         else if (i <= sbyte.MaxValue && i >= sbyte.MinValue)
         {
             buffer.Write(BinaryValue.SBYTE);
             buffer.Write((sbyte)i);
         }
         else
         {
             buffer.Write(BinaryValue.INT16);
             buffer.Write(i);
         }
     }
     else if (type == TypeInfo.Byte)
     {
         buffer.Write(BinaryValue.BYTE);
         buffer.Write((byte)value);
     }
     else if (type == TypeInfo.SByte)
     {
         buffer.Write(BinaryValue.SBYTE);
         buffer.Write((sbyte)value);
     }
     else if (type == TypeInfo.UInt32)
     {
         UInt32 i = (UInt32)value;
         if (i <= byte.MaxValue)
         {
             buffer.Write(BinaryValue.BYTE);
             buffer.Write((byte)i);
         }
         else if (i <= UInt16.MaxValue)
         {
             buffer.Write(BinaryValue.UINT16);
             buffer.Write((UInt16)i);
         }
         else
         {
             buffer.Write(BinaryValue.UINT32);
             buffer.Write(i);
         }
     }
     else if (type == TypeInfo.UInt16)
     {
         UInt16 i = (UInt16)value;
         if (i <= byte.MaxValue)
         {
             buffer.Write(BinaryValue.BYTE);
             buffer.Write((byte)i);
         }
         else
         {
             buffer.Write(BinaryValue.UINT16);
             buffer.Write(i);
         }
     }
     else if (type == TypeInfo.Int64)
     {
         Int64 i = (Int64)value;
         if (i <= byte.MaxValue && i >= byte.MinValue)
         {
             buffer.Write(BinaryValue.BYTE);
             buffer.Write((byte)i);
         }
         else if (i <= sbyte.MaxValue && i >= sbyte.MinValue)
         {
             buffer.Write(BinaryValue.SBYTE);
             buffer.Write((sbyte)i);
         }
         else if (i <= Int16.MaxValue && i >= Int16.MinValue)
         {
             buffer.Write(BinaryValue.INT16);
             buffer.Write((Int16)i);
         }
         else if (i <= UInt16.MaxValue && i >= UInt16.MinValue)
         {
             buffer.Write(BinaryValue.UINT16);
             buffer.Write((UInt16)i);
         }
         else if (i <= Int32.MaxValue && i >= Int32.MinValue)
         {
             buffer.Write(BinaryValue.INT32);
             buffer.Write((int)i);
         }
         else if (i <= UInt32.MaxValue && i >= UInt32.MaxValue)
         {
             buffer.Write(BinaryValue.UINT32);
             buffer.Write((UInt32)i);
         }
         else
         {
             buffer.Write(BinaryValue.INT64);
             buffer.Write(i);
         }
     }
     else if (type == TypeInfo.UInt64)
     {
         UInt64 i = (UInt64)value;
         if (i <= byte.MaxValue)
         {
             buffer.Write(BinaryValue.BYTE);
             buffer.Write((byte)i);
         }
         else if (i <= UInt16.MaxValue)
         {
             buffer.Write(BinaryValue.UINT16);
             buffer.Write((UInt16)i);
         }
         else if (i <= Int32.MaxValue)
         {
             buffer.Write(BinaryValue.INT32);
             buffer.Write((int)i);
         }
         else if (i <= UInt32.MaxValue)
         {
             buffer.Write(BinaryValue.UINT32);
             buffer.Write((UInt32)i);
         }
         else
         {
             buffer.Write(BinaryValue.UINT64);
             buffer.Write(i);
         }
     }
     else if (type == TypeInfo.Decimal)
     {
         buffer.Write(BinaryValue.DECIMAL);
         buffer.Write((decimal)value);
     }
     else if (type == TypeInfo.Char)
     {
         buffer.Write(BinaryValue.CHAR);
         buffer.Write((char)value);
     }
 }