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; }
public TypeSize(PhoenixTypeCode type, int size) { Type = type; Size = size; }
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; } }