Пример #1
0
        public static int GetValueSize(PhoenixTypeCode valType)
        {
            switch (valType)
            {
            case PhoenixTypeCode.Empty:
                return(0);

            case PhoenixTypeCode.Bool:
            case PhoenixTypeCode.Byte:
            case PhoenixTypeCode.Sbyte:
                return(1);

            case PhoenixTypeCode.Char:
            case PhoenixTypeCode.Short:
            case PhoenixTypeCode.Ushort:
                return(2);

            case PhoenixTypeCode.Int:
            case PhoenixTypeCode.Uint:
            case PhoenixTypeCode.Float:
            case PhoenixTypeCode.StringRef:
                return(4);

            case PhoenixTypeCode.Long:
            case PhoenixTypeCode.Ulong:
            case PhoenixTypeCode.Double:
                return(8);

            default:
                return(-1);
            }
        }
        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 PhoenixBinTypeAttribute(PhoenixTypeCode phoenixType
                                , BinPropertyReflection.SerializeConverter serializeConverter
                                , BinPropertyReflection.DeserializeConverter deserializeConverter)
 {
     this._phoenixType          = phoenixType;
     this._SerializeConverter   = serializeConverter;
     this._DeserializeConverter = DeserializeConverter;
 }
 public PhoenixBinTypeAttribute(PhoenixTypeCode phoenixType)
 {
     this._phoenixType = phoenixType;
 }
Пример #5
0
 public TypeSize(PhoenixTypeCode type, int size)
 {
     Type = type;
     Size = size;
 }
Пример #6
0
        private object ReadObjectValue(TypeSize value_typeSize, PropertyInfo property, PhoenixTypeCode typecode)
        {
            object objectvalue = null;

            switch (typecode)
            {
            case PhoenixTypeCode.Invalid:
                objectvalue = null;
                break;

            case PhoenixTypeCode.Empty:
                objectvalue = null;
                break;

            case PhoenixTypeCode.Bool:
                objectvalue = _reader.ReadBoolean();
                break;

            case PhoenixTypeCode.Byte:
                objectvalue = _reader.ReadByte();
                break;

            case PhoenixTypeCode.Sbyte:
                objectvalue = _reader.ReadSByte();
                break;

            case PhoenixTypeCode.Char:
                objectvalue = _reader.ReadChar();
                break;

            case PhoenixTypeCode.Short:
                objectvalue = _reader.ReadInt16();
                break;

            case PhoenixTypeCode.Ushort:
                objectvalue = _reader.ReadUInt16();
                break;

            case PhoenixTypeCode.Int:
                objectvalue = _reader.ReadInt32();
                break;

            case PhoenixTypeCode.Uint:
                objectvalue = _reader.ReadUInt32();
                break;

            case PhoenixTypeCode.Long:
                objectvalue = _reader.ReadInt64();
                break;

            case PhoenixTypeCode.Ulong:
                objectvalue = _reader.ReadUInt64();
                break;

            case PhoenixTypeCode.Float:
                objectvalue = _reader.ReadSingle();
                break;

            case PhoenixTypeCode.Double:
                objectvalue = _reader.ReadDouble();
                break;

            case PhoenixTypeCode.StringRef:
            {
                int id = _reader.ReadInt32();
                objectvalue = _stringTable[id];
            }
            break;

            case PhoenixTypeCode.StringVal:
                objectvalue = _reader.ReadString();
                break;

            case PhoenixTypeCode.Array:
            {
                if (property.PropertyType.IsGenericType)            // List<XYZ>
                {
                    var mi     = typeof(BinParser).GetMethod("ReadArrayObjectAs");
                    var tg     = property.PropertyType.GetGenericArguments().Single();
                    var fooRef = mi.MakeGenericMethod(property.PropertyType, tg);
                    objectvalue = fooRef.Invoke(this, new object[] { _reader.BaseStream.Position, value_typeSize });
                }
                else          // Arraytype[]
                {
                    throw new Exception("Can not read arrays");
                }
            }
            break;

            case PhoenixTypeCode.Object:
            {
                if (property.Name == "ObjectValue")
                {
                }
                var  dynattribute = property.GetCustomAttributes(typeof(DynamicReflectAttribute), false);
                bool isDynamic    = dynattribute != null && dynattribute.Length > 0;

                Type type2Use = property.PropertyType;
                if (isDynamic)
                {
                    long currentPostion = _reader.BaseStream.Position;
                    var  mi             = typeof(BinParser).GetMethod("ReadDynamicType");
                    var  fooRef         = mi.MakeGenericMethod(property.PropertyType);
                    Type newtype        = (Type)fooRef.Invoke(this, new object[] { _reader.BaseStream.Position, value_typeSize });

                    if (newtype != null)
                    {
                        type2Use = newtype;
                    }

                    _reader.BaseStream.Position = currentPostion;
                }
                {
                    var mi     = typeof(BinParser).GetMethod("ReadObjectAs");
                    var fooRef = mi.MakeGenericMethod(type2Use);
                    objectvalue = fooRef.Invoke(this, new object[] { _reader.BaseStream.Position, value_typeSize });
                }
            }
            break;

            default:
                objectvalue = null;
                break;
            }

            return(objectvalue);
        }
        public void WritePropertyValue(object value, PhoenixTypeCode phoenixType, BinaryWriter writer)
        {
            if (value == null)
            {
                writer.Write((byte)PhoenixTypeCode.Empty);
                return;
            }

            switch (phoenixType)
            {
            case PhoenixTypeCode.Array:
            case PhoenixTypeCode.Object:
                break;

            case PhoenixTypeCode.Double:
                writer.Write((byte)PhoenixTypeCode.Float);
                break;

            default:
                writer.Write((byte)phoenixType);
                break;
            }
            switch (phoenixType)
            {
            case PhoenixTypeCode.Invalid:
                throw new Exception();

            case PhoenixTypeCode.Empty:
                throw new Exception();

            case PhoenixTypeCode.Bool:
                writer.Write((bool)value);
                break;

            case PhoenixTypeCode.Byte:
                writer.Write((byte)value);
                break;

            case PhoenixTypeCode.Sbyte:
                writer.Write((sbyte)value);
                break;

            case PhoenixTypeCode.Char:
                writer.Write((char)value);
                break;

            case PhoenixTypeCode.Short:
                writer.Write((short)value);
                break;

            case PhoenixTypeCode.Ushort:
                writer.Write((ushort)value);
                break;

            case PhoenixTypeCode.Int:
                writer.Write((Int32)value);
                break;

            case PhoenixTypeCode.Uint:
                writer.Write((UInt32)value);
                break;

            case PhoenixTypeCode.Long:
                writer.Write((long)value);
                break;

            case PhoenixTypeCode.Ulong:
                writer.Write((ulong)value);
                break;

            case PhoenixTypeCode.Float:
                writer.Write((float)value);
                break;

            case PhoenixTypeCode.Double:
                writer.Write((float)(double)value);
                break;

            case PhoenixTypeCode.StringRef:
                //writer.Write((Int32)4 + 4);
                writer.Write((Int32)value);
                break;

            case PhoenixTypeCode.StringVal:
            {
                string s = (string)value;

                //if (s.Length < 200)
                //{
                //    writer.Write((Int32)4 + data.Length +1);
                //}
                using (var obj_stream = new MemoryStream())
                {
                    using (var obj_writer = new BinaryWriter(obj_stream))
                    {
                        obj_writer.Write((string)s);
                        byte[] data = obj_stream.ToArray();
                        writer.Write((Int32)4 + data.Length);
                        writer.Write((string)s);
                    }
                }
            }
            break;

            case PhoenixTypeCode.Array:

                Type type1 = value.GetType();

                if (type1.IsGenericType)        // List<XYZ>
                {
                    var mi = typeof(BinWriter).GetMethod("WriteArrayObject");

                    var tg     = type1.GetGenericArguments().Single();
                    var fooRef = mi.MakeGenericMethod(tg);
                    fooRef.Invoke(this, new object[] { value, writer });
                }

                //using (var obj_stream = new MemoryStream())
                //{
                //    using (var obj_writer = new BinaryWriter(obj_stream))
                //    {
                //        WriteObjectProperties(value, obj_writer);
                //        writer.Write(obj_stream.ToArray());
                //    }
                //}
                break;

            case PhoenixTypeCode.Object:

                WriteObject(value, writer);
                //using (var obj_stream = new MemoryStream())
                //{
                //    using (var obj_writer = new BinaryWriter(obj_stream))
                //    {
                //        WriteObjectProperties(value, obj_writer);
                //        writer.Write(obj_stream.ToArray());
                //    }
                //}

                break;

            default:
                break;
            }
        }