Example #1
0
        void WriteDataTableData(DataTable table)
        {
            OutputChar('"');
            OutputText(table.TableName);
            OutputText("\":[");
            var cols         = table.Columns;
            var rowseparator = false;
            var cl           = cols.Count;
            var w            = new WriteJsonValue[cl];

            if (table.Rows.Count > 3)
            {
                for (int i = w.Length - 1; i >= 0; i--)
                {
                    w[i] = GetWriteJsonMethod(cols[i].DataType);
                }
            }
            else
            {
                w = null;
            }
            foreach (DataRow row in table.Rows)
            {
                if (rowseparator)
                {
                    OutputChar(',');
                }
                rowseparator = true;
                OutputChar('[');

                for (int j = 0; j < cl; j++)
                {
                    if (j > 0)
                    {
                        OutputChar(',');
                    }
                    if (w != null)
                    {
                        w[j] (this, row[j]);
                    }
                    else
                    {
                        WriteValue(row[j]);
                    }
                }
                OutputChar(']');
            }

            OutputChar(']');
        }
Example #2
0
        static WriteJsonValue[] RegisterMethods()
        {
            var r = new WriteJsonValue[Enum.GetNames(typeof(JsonDataType)).Length];

            r[(int)JsonDataType.Array]                 = WriteArray;
            r[(int)JsonDataType.Bool]                  = WriteBoolean;
            r[(int)JsonDataType.ByteArray]             = WriteByteArray;
            r[(int)JsonDataType.DataSet]               = WriteDataSet;
            r[(int)JsonDataType.DataTable]             = WriteDataTable;
            r[(int)JsonDataType.DateTime]              = WriteDateTime;
            r[(int)JsonDataType.Dictionary]            = WriteDictionary;
            r[(int)JsonDataType.Double]                = WriteDouble;
            r[(int)JsonDataType.Enum]                  = WriteEnum;
            r[(int)JsonDataType.List]                  = WriteArray;
            r[(int)JsonDataType.Guid]                  = WriteGuid;
            r[(int)JsonDataType.Hashtable]             = WriteDictionary;
            r[(int)JsonDataType.Int]                   = WriteInt32;
            r[(int)JsonDataType.Long]                  = WriteInt64;
            r[(int)JsonDataType.MultiDimensionalArray] = WriteMultiDimensionalArray;
            r[(int)JsonDataType.NameValue]             = WriteNameValueCollection;
            r[(int)JsonDataType.Object]                = WriteUnknown;
            r[(int)JsonDataType.Single]                = WriteSingle;
            r[(int)JsonDataType.String]                = WriteString;
            r[(int)JsonDataType.StringDictionary]      = WriteStringDictionary;
            r[(int)JsonDataType.StringKeyDictionary]   = WriteDictionary;
            r[(int)JsonDataType.TimeSpan]              = WriteTimeSpan;
            r[(int)JsonDataType.Undefined]             = WriteObject;
            return(r);
        }
Example #3
0
        MemberCache(MemberInfo memberInfo, Type memberType, string name)
        {
            MemberName = name;
            MemberType = memberType;
            MemberInfo = memberInfo;
            JsonDataType dt = Reflection.GetJsonDataType(memberType);

            DeserializeMethod = JsonDeserializer.GetReadJsonMethod(memberType);
            SerializeMethod   = JsonSerializer.GetWriteJsonMethod(memberType);

            if (dt == JsonDataType.Array || dt == JsonDataType.MultiDimensionalArray)
            {
                ElementType = memberType.GetElementType();
            }

            IsValueType  = memberType.IsValueType;
            IsStruct     = (IsValueType && !memberType.IsPrimitive && !memberType.IsEnum && typeof(decimal).Equals(memberType) == false);
            IsClass      = memberType.IsClass;
            IsCollection = typeof(ICollection).IsAssignableFrom(memberType) && typeof(byte[]).Equals(memberType) == false;
            if (memberType.IsGenericType)
            {
                ElementType = memberType.GetGenericArguments()[0];
                IsNullable  = memberType.GetGenericTypeDefinition().Equals(typeof(Nullable <>));
            }
            if (IsValueType)
            {
                ChangeType = IsNullable ? ElementType : memberType;
            }
            JsonDataType = dt;
        }
Example #4
0
 public JsonMemberGetter(SerializationInfo typeInfo, MemberCache member, SerializationManager manager)
 {
     Member          = member;
     MemberName      = member.MemberName;
     SerializedName  = member.MemberName;
     SerializeMethod = JsonSerializer.GetWriteJsonMethod(member.MemberType);
     OwnerTypeInfo   = typeInfo;
     TypeInfo        = member.MemberInfo.ReflectedType.Equals(member.MemberType) ? typeInfo : manager.GetSerializationInfo(member.MemberType);
 }
Example #5
0
        /// <summary>
        /// Writes the JSON array representation from an <see cref="IDataReader"/> to the output <paramref name="target" />.
        /// </summary>
        /// <param name="data">The data to be serialized.</param>
        /// <param name="target">The output target.</param>
        /// <param name="manager">The <see cref="SerializationManager"/> to control advanced JSON serialization.</param>
        public static void WriteAsDataArray(this IDataReader data, TextWriter target, SerializationManager manager)
        {
            var js = new JsonSerializer(manager, target);

            target.Write(JsonSerializer.StartArray);
            var l  = data.FieldCount;
            var fs = new WriteJsonValue[l];

            for (int i = l - 1; i >= 0; i--)
            {
                fs[i] = manager.GetSerializationInfo(data.GetFieldType(i)).SerializeMethod;
            }
            var    c = -1;
            object v;

            while (data.Read())
            {
                if (++c > 0)
                {
                    target.Write(JsonSerializer.Separator);
                }
                target.Write(JsonSerializer.StartArray);
                for (int i = 0; i < l; i++)
                {
                    if (i > 0)
                    {
                        target.Write(JsonSerializer.Separator);
                    }
                    v = data.GetValue(i);
                    if (v == null)
                    {
                        target.Write(JsonSerializer.Null);
                    }
                    else
                    {
                        fs[i] (js, v);
                    }
                }
                target.Write(JsonSerializer.EndArray);
            }
            target.Write(JsonSerializer.EndArray);
        }
Example #6
0
 public SerializationInfo(ReflectionCache reflection)
 {
     Reflection            = reflection;
     Constructor           = reflection.Constructor;
     CommonType            = reflection.CommonType;
     JsonDataType          = reflection.JsonDataType;
     SerializeMethod       = reflection.SerializeMethod;
     DeserializeMethod     = reflection.DeserializeMethod;
     ItemDeserializeMethod = reflection.ItemDeserializer;
     AlwaysDeserializable  = false;
 }
Example #7
0
        void WriteMultiDimensionalArray(WriteJsonValue m, Array md)
        {
            var r   = md.Rank;
            var lb  = new int[r];
            var ub  = new int[r];
            var mdi = new int[r];

            for (int i = 0; i < r; i++)
            {
                lb[i] = md.GetLowerBound(i);
                ub[i] = md.GetUpperBound(i) + 1;
            }
            Array.Copy(lb, 0, mdi, 0, r);
            WriteMultiDimensionalArray(m, md, r, lb, ub, mdi, 0);
        }
Example #8
0
        void WriteMultiDimensionalArray(WriteJsonValue m, Array array, int rank, int[] lowerBounds, int[] upperBounds, int[] indexes, int rankIndex)
        {
            var u = upperBounds[rankIndex];

            if (rankIndex < rank - 1)
            {
                OutputChar('[');
                bool s = false;
                var  d = rankIndex;
                do
                {
                    if (s)
                    {
                        OutputChar(',');
                    }
                    Array.Copy(lowerBounds, d + 1, indexes, d + 1, rank - d - 1);
                    WriteMultiDimensionalArray(m, array, rank, lowerBounds, upperBounds, indexes, ++d);
                    d = rankIndex;
                    s = true;
                } while (++indexes[rankIndex] < u);
                OutputChar(']');
            }
            else if (rankIndex == rank - 1)
            {
                OutputChar('[');
                bool s = false;
                do
                {
                    if (s)
                    {
                        OutputChar(',');
                    }
                    var v = array.GetValue(indexes);
                    if (v == null || v is DBNull)
                    {
                        OutputText("null");
                    }
                    else
                    {
                        m(this, v);
                    }
                    s = true;
                } while (++indexes[rankIndex] < u);
                OutputChar(']');
            }
        }
Example #9
0
        internal ReflectionCache(Type type)
        {
            Type         = type;
            TypeName     = type.FullName;
            AssemblyName = type.AssemblyQualifiedName;

            JsonDataType      = Reflection.GetJsonDataType(type);
            SerializeMethod   = JsonSerializer.GetWriteJsonMethod(type);
            DeserializeMethod = JsonDeserializer.GetReadJsonMethod(type);

            if (JsonDataType == JsonDataType.Enum)
            {
                IsFlaggedEnum = AttributeHelper.HasAttribute <FlagsAttribute> (type, false);
                return;
            }

            if (type.IsArray)
            {
                ArgumentTypes = new Type[] { type.GetElementType() };
                CommonType    = type.GetArrayRank() == 1 ? ComplexType.Array : ComplexType.MultiDimensionalArray;
            }
            else
            {
                var t = type;
                if (t.IsGenericType == false)
                {
                    while ((t = t.BaseType) != null)
                    {
                        if (t.IsGenericType)
                        {
                            break;
                        }
                    }
                }
                if (t != null)
                {
                    ArgumentTypes = t.GetGenericArguments();
                    var gt = t.GetGenericTypeDefinition();
                    if (gt.Equals(typeof(Dictionary <,>)))
                    {
                        CommonType = ComplexType.Dictionary;
                    }
                    else if (gt.Equals(typeof(List <>)))
                    {
                        CommonType = ComplexType.List;
                    }
                    else if (gt.Equals(typeof(Nullable <>)))
                    {
                        CommonType      = ComplexType.Nullable;
                        SerializeMethod = JsonSerializer.GetWriteJsonMethod(ArgumentTypes[0]);
                    }
                }
            }
            if (typeof(IEnumerable).IsAssignableFrom(type))
            {
                if (typeof(Array).IsAssignableFrom(type) == false)
                {
                    AppendItem = Reflection.CreateWrapperMethod <AddCollectionItem> (Reflection.FindMethod(type, "Add", new Type[1] {
                        null
                    }));
                }
                if (ArgumentTypes != null && ArgumentTypes.Length == 1)
                {
                    ItemSerializer   = JsonSerializer.GetWriteJsonMethod(ArgumentTypes[0]);
                    ItemDeserializer = JsonDeserializer.GetReadJsonMethod(ArgumentTypes[0]);
                }
            }
            if (ArgumentTypes != null)
            {
                ArgumentReflections = new ReflectionCache[ArgumentTypes.Length];
            }
            if (CommonType != ComplexType.Array &&
                CommonType != ComplexType.MultiDimensionalArray &&
                CommonType != ComplexType.Nullable)
            {
                var t = type;
                if (type.IsNested == false && type.IsPublic == false)
                {
                    ConstructorInfo |= ConstructorTypes.NonPublic;
                }
                else
                {
                    while (t != null && t.IsNested)
                    {
                        if (t.IsNestedPublic == false)
                        {
                            ConstructorInfo |= ConstructorTypes.NonPublic;
                        }
                        t = t.DeclaringType;
                    }
                }
                if (type.IsClass || type.IsValueType)
                {
                    Constructor = Reflection.CreateConstructorMethod(type, type.IsVisible == false || typeof(DatasetSchema).Equals(type));
                    if (Constructor != null && Constructor.Method.IsPublic == false)
                    {
                        ConstructorInfo |= ConstructorTypes.NonPublic;
                    }
                    if (Constructor == null)
                    {
                        var c = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                        if (c != null && c.Length > 0)
                        {
                            ConstructorInfo |= ConstructorTypes.Parametric;
                        }
                    }

                    Members = Reflection.GetMembers(type);
                }
            }
            //if (typeof (IEnumerable).IsAssignableFrom (type)) {
            //	return;
            //}
            //if (JsonDataType != JsonDataType.Undefined) {
            //	return;
            //}
        }
Example #10
0
 void WriteMultiDimensionalArray(WriteJsonValue m, Array array, int rank, int[] lowerBounds, int[] upperBounds, int[] indexes, int rankIndex)
 {
     var u = upperBounds[rankIndex];
     if (rankIndex < rank - 1) {
         _output.Append ('[');
         bool s = false;
         var d = rankIndex;
         do {
             if (s) {
                 _output.Append (',');
             }
             Array.Copy (lowerBounds, d + 1, indexes, d + 1, rank - d - 1);
             WriteMultiDimensionalArray (m, array, rank, lowerBounds, upperBounds, indexes, ++d);
             d = rankIndex;
             s = true;
         } while (++indexes[rankIndex] < u);
         _output.Append (']');
     }
     else if (rankIndex == rank - 1) {
         _output.Append ('[');
         bool s = false;
         do {
             if (s) {
                 _output.Append (',');
             }
             var v = array.GetValue (indexes);
             if (v == null || v is DBNull) {
                 _output.Append ("null");
             }
             else {
                 m (this, v);
             }
             s = true;
         } while (++indexes[rankIndex] < u);
         _output.Append (']');
     }
 }
Example #11
0
 void WriteMultiDimensionalArray(WriteJsonValue m, Array md)
 {
     var r = md.Rank;
     var lb = new int[r];
     var ub = new int[r];
     var mdi = new int[r];
     for (int i = 0; i < r; i++) {
         lb[i] = md.GetLowerBound (i);
         ub[i] = md.GetUpperBound (i) + 1;
     }
     Array.Copy (lb, 0, mdi, 0, r);
     WriteMultiDimensionalArray (m, md, r, lb, ub, mdi, 0);
 }
Example #12
0
 static WriteJsonValue[] RegisterMethods()
 {
     var r = new WriteJsonValue[Enum.GetNames (typeof (JsonDataType)).Length];
     r[(int)JsonDataType.Array] = WriteArray;
     r[(int)JsonDataType.Bool] = WriteBoolean;
     r[(int)JsonDataType.ByteArray] = WriteByteArray;
     r[(int)JsonDataType.Custom] = WriteCustom;
     r[(int)JsonDataType.DataSet] = WriteDataSet;
     r[(int)JsonDataType.DataTable] = WriteDataTable;
     r[(int)JsonDataType.DateTime] = WriteDateTime;
     r[(int)JsonDataType.Dictionary] = WriteDictionary;
     r[(int)JsonDataType.Double] = WriteDouble;
     r[(int)JsonDataType.Enum] = WriteEnum;
     r[(int)JsonDataType.List] = WriteArray;
     r[(int)JsonDataType.Guid] = WriteGuid;
     r[(int)JsonDataType.Hashtable] = WriteDictionary;
     r[(int)JsonDataType.Int] = WriteInt32;
     r[(int)JsonDataType.Long] = WriteInt64;
     r[(int)JsonDataType.MultiDimensionalArray] = WriteMultiDimensionalArray;
     r[(int)JsonDataType.NameValue] = WriteNameValueCollection;
     r[(int)JsonDataType.Object] = WriteUnknown;
     r[(int)JsonDataType.Single] = WriteSingle;
     r[(int)JsonDataType.String] = WriteString;
     r[(int)JsonDataType.StringDictionary] = WriteStringDictionary;
     r[(int)JsonDataType.StringKeyDictionary] = WriteDictionary;
     r[(int)JsonDataType.TimeSpan] = WriteTimeSpan;
     r[(int)JsonDataType.Undefined] = WriteObject;
     return r;
 }
Example #13
0
        void WriteDataTableData(DataTable table)
        {
            _output.Append ('\"');
            _output.Append (table.TableName);
            _output.Append ("\":[");
            var cols = table.Columns;
            var rowseparator = false;
            var cl = cols.Count;
            var w = new WriteJsonValue[cl];
            if (table.Rows.Count > 3) {
                for (int i = w.Length - 1; i >= 0; i--) {
                    w[i] = GetWriteJsonMethod (cols[i].DataType);
                }
            }
            else {
                w = null;
            }
            foreach (DataRow row in table.Rows) {
                if (rowseparator) _output.Append (',');
                rowseparator = true;
                _output.Append ('[');

                for (int j = 0; j < cl; j++) {
                    if (j > 0) {
                        _output.Append (',');
                    }
                    if (w != null) {
                        w[j] (this, row[j]);
                    }
                    else {
                        WriteValue (row[j]);
                    }
                }
                _output.Append (']');
            }

            _output.Append (']');
        }
Example #14
0
        internal ReflectionCache(Type type)
        {
            Type = type;
            TypeName = type.FullName;
            AssemblyName = type.AssemblyQualifiedName;

            JsonDataType = Reflection.GetJsonDataType (type);
            SerializeMethod = JsonSerializer.GetWriteJsonMethod (type);
            DeserializeMethod = JsonDeserializer.GetReadJsonMethod (type);

            if (JsonDataType == JsonDataType.Enum) {
                IsFlaggedEnum = AttributeHelper.HasAttribute<FlagsAttribute> (type, false);
                return;
            }

            if (type.IsArray) {
                ArgumentTypes = new Type[] { type.GetElementType () };
                CommonType = type.GetArrayRank () == 1 ? ComplexType.Array : ComplexType.MultiDimensionalArray;
            }
            else {
                var t = type;
                if (t.IsGenericType == false) {
                    while ((t = t.BaseType) != null) {
                        if (t.IsGenericType) {
                            break;
                        }
                    }
                }
                if (t != null) {
                    ArgumentTypes = t.GetGenericArguments ();
                    var gt = t.GetGenericTypeDefinition ();
                    if (gt.Equals (typeof (Dictionary<,>))) {
                        CommonType = ComplexType.Dictionary;
                    }
                    else if (gt.Equals (typeof (List<>))) {
                        CommonType = ComplexType.List;
                    }
                    else if (gt.Equals (typeof (Nullable<>))) {
                        CommonType = ComplexType.Nullable;
                        SerializeMethod = JsonSerializer.GetWriteJsonMethod (ArgumentTypes[0]);
                    }
                }
            }
            if (typeof(IEnumerable).IsAssignableFrom (type)) {
                if (typeof(Array).IsAssignableFrom (type) == false) {
                    AppendItem = Reflection.CreateWrapperMethod<AddCollectionItem> (Reflection.FindMethod (type, "Add", new Type[1] { null }));
                }
                if (ArgumentTypes != null && ArgumentTypes.Length == 1) {
                    ItemSerializer = JsonSerializer.GetWriteJsonMethod (ArgumentTypes[0]);
                    ItemDeserializer = JsonDeserializer.GetReadJsonMethod (ArgumentTypes[0]);
                }
            }
            if (ArgumentTypes != null) {
                ArgumentReflections = new ReflectionCache[ArgumentTypes.Length];
            }
            if (CommonType != ComplexType.Array
                && CommonType != ComplexType.MultiDimensionalArray
                && CommonType != ComplexType.Nullable) {
                var t = type;
                if (type.IsNested == false && type.IsPublic == false) {
                    ConstructorInfo |= ConstructorTypes.NonPublic;
                }
                else {
                    while (t != null && t.IsNested) {
                        if (t.IsNestedPublic == false) {
                            ConstructorInfo |= ConstructorTypes.NonPublic;
                        }
                        t = t.DeclaringType;
                    }
                }
                if (type.IsClass || type.IsValueType) {
                    Constructor = Reflection.CreateConstructorMethod (type, type.IsVisible == false || typeof (DatasetSchema).Equals (type));
                    if (Constructor != null && Constructor.Method.IsPublic == false) {
                        ConstructorInfo |= ConstructorTypes.NonPublic;
                    }
                    if (Constructor == null) {
                        var c = type.GetConstructors (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                        if (c != null && c.Length > 0) {
                            ConstructorInfo |= ConstructorTypes.Parametric;
                        }
                    }

                    Members = Reflection.GetMembers (type);
                }
            }
            //if (typeof (IEnumerable).IsAssignableFrom (type)) {
            //	return;
            //}
            //if (JsonDataType != JsonDataType.Undefined) {
            //	return;
            //}
        }
Example #15
0
        MemberCache(MemberInfo memberInfo, Type memberType, string name)
        {
            MemberName = name;
            MemberType = memberType;
            MemberInfo = memberInfo;
            JsonDataType dt = Reflection.GetJsonDataType (memberType);
            DeserializeMethod = JsonDeserializer.GetReadJsonMethod (memberType);
            SerializeMethod = JsonSerializer.GetWriteJsonMethod (memberType);

            if (dt == JsonDataType.Array || dt == JsonDataType.MultiDimensionalArray) {
                ElementType = memberType.GetElementType ();
            }

            IsValueType = memberType.IsValueType;
            IsStruct = (IsValueType && !memberType.IsPrimitive && !memberType.IsEnum && typeof (decimal).Equals (memberType) == false);
            IsClass = memberType.IsClass;
            IsCollection = typeof (ICollection).IsAssignableFrom (memberType) && typeof (byte[]).Equals (memberType) == false;
            if (memberType.IsGenericType) {
                ElementType = memberType.GetGenericArguments ()[0];
                IsNullable = memberType.GetGenericTypeDefinition ().Equals (typeof (Nullable<>));
            }
            if (IsValueType) {
                ChangeType = IsNullable ? ElementType : memberType;
            }
            JsonDataType = dt;
        }