public void WriteArrayObject <T>(List <T> obj, BinaryWriter writer) { var type = obj.GetType(); var genType = type.GetGenericArguments().Single(); PhoenixTypeCode phoenixType = ReflectionMaster.GetPhoenixTypeCode(genType); using (var obj_stream = new MemoryStream()) { using (var obj_writer = new BinaryWriter(obj_stream)) { foreach (var item in obj) { WritePropertyValue(item, phoenixType, obj_writer); } byte[] data = obj_stream.ToArray(); writer.Write((byte)PhoenixTypeCode.Array); writer.Write((Int32)data.Length + 4); writer.Write(data); } } }
public T ReadArrayObjectAs <T, G>(long position, TypeSize typeSize) { var startposition = position; var endposition = position + typeSize.Size; _reader.BaseStream.Position = startposition; T instance = Activator.CreateInstance <T>(); var tt = typeof(T); while (_reader.BaseStream.Position < endposition) { var desc_typeSize = ReadTypeAndSize(_reader.BaseStream.Position); object objectvalue; if (desc_typeSize.Type == PhoenixTypeCode.Object || desc_typeSize.Type == PhoenixTypeCode.Array) { objectvalue = ReadObjectAs <G>(_reader.BaseStream.Position, desc_typeSize); } else { objectvalue = ReadObjectValue(desc_typeSize, null, desc_typeSize.Type); if (desc_typeSize.Type == PhoenixTypeCode.Float) { var proptype = ReflectionMaster.GetPhoenixTypeCode(typeof(G)); if (proptype == PhoenixTypeCode.Double) { ((ICollection <double>)instance).Add((double)(float)objectvalue); continue; } } } if (tt.GetInterface("ICollection`1") != null) { ((ICollection <G>)instance).Add((G)objectvalue); } } return(instance); }