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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }