Example #1
0
        public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type)
        {
            var obj = new object();

            serializer.InternalAddReadObjToCacheList(obj);
            return(obj);
        }
Example #2
0
        public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type)
        {
            var method_write = this.GetType()
                               .GetMethod("ReadGeneric", BindingFlags.Static | BindingFlags.NonPublic)
                               .MakeGenericMethod(type.GetGenericArguments());

            return(method_write.Invoke(null, new object[] { serializer, reader }));
        }
Example #3
0
        public override void Write(IBinarySerializerForHandle serializer, BinaryWriter writer, object obj)
        {
            var method_write = this.GetType()
                               .GetMethod("WriteGeneric", BindingFlags.Static | BindingFlags.NonPublic)
                               .MakeGenericMethod(obj.GetType().GetGenericArguments());

            method_write.Invoke(null, new object[] { serializer, writer, obj });
        }
Example #4
0
 static void WriteGeneric <T>(IBinarySerializerForHandle serializer, BinaryWriter writer, List <T> obj)
 {
     writer.Write(obj.Count);
     for (int i = 0; i < obj.Count; ++i)
     {
         serializer.InternalWrite(writer, obj[i], typeof(T));
     }
 }
        public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type)
        {
            int count = reader.ReadInt32();
            var obj   = reader.ReadBytes(count);

            serializer.InternalAddReadObjToCacheList(obj);
            return(obj);
        }
Example #6
0
 static void WriteGeneric <TKey, TValue>(IBinarySerializerForHandle serializer, BinaryWriter writer, Dictionary <TKey, TValue> obj)
 {
     writer.Write(obj.Count);
     foreach (var item in obj)
     {
         serializer.InternalWrite(writer, item.Key, typeof(TKey));
         serializer.InternalWrite(writer, item.Value, typeof(TValue));
     }
 }
Example #7
0
        public override void Write(IBinarySerializerForHandle serializer, BinaryWriter writer, object obj)
        {
            var fields = serializer.GetClassFieldInfos(obj.GetType());

            foreach (var field in fields)
            {
                var val = field.GetValue(obj);
                serializer.InternalWrite(writer, val, field.FieldType);
            }
        }
Example #8
0
        static object ReadGeneric <T>(IBinarySerializerForHandle serializer, BinaryReader reader)
        {
            int      count = reader.ReadInt32();
            List <T> obj   = new List <T>(count);

            serializer.InternalAddReadObjToCacheList(obj);
            for (int i = 0; i < count; ++i)
            {
                obj.Add((T)serializer.InternalRead(reader, typeof(T)));
            }
            return(obj);
        }
        public override void Write(IBinarySerializerForHandle serializer, BinaryWriter writer, object obj)
        {
            Array arr          = (Array)obj;
            var   type         = obj.GetType();
            var   element_type = type.GetElementType();
            int   rank         = type.GetArrayRank();

            int[] lengths     = new int[rank];
            int[] lowerBounds = new int[rank];
            int[] uperBounds  = new int[rank];
            int[] idxs        = new int[rank];// for read will use
            bool  is_empty    = false;

            for (int i = 0; i < rank; ++i)
            {
                lengths[i] = arr.GetLength(i);
                writer.Write(lengths[i]);
                lowerBounds[i] = arr.GetLowerBound(i);
                writer.Write(lowerBounds[i]);
                uperBounds[i] = arr.GetUpperBound(i);
                idxs[i]       = lowerBounds[i];
                is_empty      = is_empty || (lengths[i] == 0);
            }
            if (is_empty)
            {
                return; // why c# allow `new int[0,0]`
            }

            for (; ;)
            {
                var val = arr.GetValue(idxs);
                serializer.InternalWrite(writer, val, element_type);
                // next
                int dim = rank - 1;
                for (; dim >= 0; --dim)
                {
                    if (idxs[dim] < uperBounds[dim])
                    {
                        break;
                    }
                }
                if (dim == -1)
                {
                    break;           // loop end
                }
                idxs[dim]++;
                for (dim++; dim < rank; ++dim)
                {
                    idxs[dim] = lowerBounds[dim];
                }
            }
        }
        public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type)
        {
            int rank         = type.GetArrayRank();
            var element_type = type.GetElementType();

            int[] lengths     = new int[rank];
            int[] lowerBounds = new int[rank];
            int[] uperBounds  = new int[rank];
            int[] idxs        = new int[rank];// for read will use
            bool  is_empty    = false;

            for (int i = 0; i < rank; ++i)
            {
                lengths[i]     = reader.ReadInt32();
                lowerBounds[i] = reader.ReadInt32();
                uperBounds[i]  = lengths[i] - 1 + lowerBounds[i];
                idxs[i]        = lowerBounds[i];
                is_empty       = is_empty || (lengths[i] == 0);
            }
            var arr = Array.CreateInstance(element_type, lengths, lowerBounds);

            serializer.InternalAddReadObjToCacheList(arr);
            if (is_empty)
            {
                return(arr);// why c# allow `new int[0,0]`
            }
            for (; ;)
            {
                var val = serializer.InternalRead(reader, element_type);
                arr.SetValue(val, idxs);
                // next
                int dim = rank - 1;
                for (; dim >= 0; --dim)
                {
                    if (idxs[dim] < uperBounds[dim])
                    {
                        break;
                    }
                }
                if (dim == -1)
                {
                    break;           // loop end
                }
                idxs[dim]++;
                for (dim++; dim < rank; ++dim)
                {
                    idxs[dim] = lowerBounds[dim];
                }
            }

            return(arr);
        }
Example #11
0
        static object ReadGeneric <TKey, TValue>(IBinarySerializerForHandle serializer, BinaryReader reader)
        {
            int count = reader.ReadInt32();
            Dictionary <TKey, TValue> obj = new Dictionary <TKey, TValue>(count);

            serializer.InternalAddReadObjToCacheList(obj);
            for (int i = 0; i < count; ++i)
            {
                TKey   key   = (TKey)serializer.InternalRead(reader, typeof(TKey));
                TValue value = (TValue)serializer.InternalRead(reader, typeof(TValue));
                obj.Add(key, value);
            }
            return(obj);
        }
Example #12
0
        public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type)
        {
            var    fields = serializer.GetClassFieldInfos(type);
            object obj    = FormatterServices.GetUninitializedObject(type);

            if (type.IsValueType == false)
            {
                serializer.InternalAddReadObjToCacheList(obj);
            }
            foreach (var field in fields)
            {
                var val = serializer.InternalRead(reader, field.FieldType);
                field.SetValue(obj, val);
            }
            return(obj);
        }
Example #13
0
        public override IEnumerable <Type> AddSubtypes(IBinarySerializerForHandle serializer, Type type)
        {
            if (type.IsAbstract || type.IsInterface)
            {
                yield break;// can not use new Type[0]
            }
            else
            {
                var fields       = GetFieldInfos(type);
                var fields_array = fields.ToArray();
                serializer.AddClassFieldInfos(type, fields_array);

                foreach (var field in fields_array)
                {
                    yield return(field.FieldType);
                }
            }
        }
Example #14
0
        public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type)
        {
            object obj = serializer.InternalRead(reader, Enum.GetUnderlyingType(type));

            return(obj);// Enum里没有好的方法转换类型,发现可以直接=
        }
 public override IEnumerable <Type> AddSubtypes(IBinarySerializerForHandle serializer, Type type)
 {
     yield return(type.GetElementType());
 }
 /// <summary>
 /// Return types that are needed to serialize the given type
 /// </summary>
 public virtual IEnumerable <Type> AddSubtypes(IBinarySerializerForHandle serializer, Type type)
 {
     yield break;
 }
 public abstract object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type);
Example #18
0
 public override IEnumerable <Type> AddSubtypes(IBinarySerializerForHandle serializer, Type type)
 {
     return(type.GetGenericArguments());
 }
Example #19
0
        public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type)
        {
            long v = reader.ReadInt64();

            return(DateTime.FromBinary(v));
        }
Example #20
0
        public override void Write(IBinarySerializerForHandle serializer, BinaryWriter writer, object obj)
        {
            long v = ((DateTime)obj).ToBinary();

            writer.Write(v);
        }
Example #21
0
 public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type)
 {
     return(reader.ReadDecimal());
 }
Example #22
0
 public override void Write(IBinarySerializerForHandle serializer, BinaryWriter writer, object obj)
 {
     writer.Write((decimal)obj);
 }
Example #23
0
 public override IEnumerable <Type> AddSubtypes(IBinarySerializerForHandle serializer, Type type)
 {
     return(new[] { Enum.GetUnderlyingType(type) });
 }
Example #24
0
 public override void Write(IBinarySerializerForHandle serializer, BinaryWriter writer, object obj)
 {
     serializer.InternalWrite(writer, obj, Enum.GetUnderlyingType(obj.GetType()));
 }
 public override void Write(IBinarySerializerForHandle serializer, BinaryWriter writer, object obj)
 {
     byte[] data = (byte[])obj;
     writer.Write(data.Length);
     writer.Write(data);
 }
Example #26
0
 public override void Write(IBinarySerializerForHandle serializer, BinaryWriter writer, object obj)
 {
     Debug.Assert(typeof(object) == obj.GetType());
     return;
 }
 public abstract void Write(IBinarySerializerForHandle serializer, BinaryWriter writer, object obj);