コード例 #1
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);
        }
コード例 #2
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);
        }
コード例 #3
0
        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);
        }
コード例 #4
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);
        }
コード例 #5
0
        public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type)
        {
            object obj = serializer.InternalRead(reader, Enum.GetUnderlyingType(type));

            return(obj);// Enum里没有好的方法转换类型,发现可以直接=
        }