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); }
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 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); }
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); }
public override object Read(IBinarySerializerForHandle serializer, BinaryReader reader, Type type) { object obj = serializer.InternalRead(reader, Enum.GetUnderlyingType(type)); return(obj);// Enum里没有好的方法转换类型,发现可以直接= }