private static void GenSerialize(Type type, MemoryStreamWriter msWriter) { EntityBufTypeFlag flag = EntityBufTypeFlag.Empty; msWriter.WriteByte((byte)flag); Tuple <EntityBufType, bool> tuple = GetTypeBufType(type); object instance = null; if (tuple.Item1.EntityType != EntityType.COMPLEX) { if (tuple.Item1.Property != null && tuple.Item1.Property.PropertyInfo.DeclaringType != null) { var cor = tuple.Item1.Property.PropertyInfo.DeclaringType.GetConstructor(new Type[0]); if (cor != null) { instance = cor.Invoke(null); } } GenSerializeSimple(instance, tuple.Item2, tuple.Item1, msWriter); return; } bool isArray; //PropertyInfo[] props = o.GetType().GetProperties(); var entitybuftypelist = GetTypeEntityBufType(type); //foreach (var tp in entitybuftypelist) Tuple <EntityBufType, bool> tp = null; instance = null; { var cor = type.GetConstructor(new Type[0]); if (cor != null) { instance = cor.Invoke(null); } } for (int i = 0; i < entitybuftypelist.Count; i++) { tp = entitybuftypelist[i]; //EntityBufType buftype = MapBufType(prop.PropertyType, out isArray); isArray = tp.Item2; if (tp.Item1.EntityType == EntityType.COMPLEX) { GenSerializeComplex(isArray, tp.Item1, msWriter); } else { GenSerializeSimple(instance, isArray, tp.Item1, msWriter); } } }
private static void SerializeComplex(object val, bool isArray, EntityBufType bufType, MemoryStreamWriter msWriter) { if (isArray) { var vals = (object[])val; int len = -1; if (vals != null) { len = vals.Length; } msWriter.WriteInt32(len); if (len > 0) { foreach (object v in vals) { //写入标志 if (v != null) { EntityBufTypeFlag flag = EntityBufTypeFlag.Empty; msWriter.WriteByte((byte)flag); Serialize(v, msWriter); } else { EntityBufTypeFlag flag = EntityBufTypeFlag.VlaueNull; msWriter.WriteByte((byte)flag); } } } } else { //msWriter.WriteByte(complexchar); //msWriter.WriteByte(complexchar); if (val != null) { EntityBufTypeFlag flag = EntityBufTypeFlag.Empty; msWriter.WriteByte((byte)flag); Serialize(val, msWriter); } else { EntityBufTypeFlag flag = EntityBufTypeFlag.VlaueNull; msWriter.WriteByte((byte)flag); } } }
private static void Serialize(object o, MemoryStreamWriter msWriter) { if (o == null) { EntityBufTypeFlag flag = EntityBufTypeFlag.VlaueNull; msWriter.WriteByte((byte)flag); return; } else { EntityBufTypeFlag flag = EntityBufTypeFlag.Empty; msWriter.WriteByte((byte)flag); } Tuple <EntityBufType, bool> tuple = GetTypeBufType(o.GetType()); if (tuple.Item1.EntityType != EntityType.COMPLEX) { SerializeSimple(o, tuple.Item2, tuple.Item1, msWriter); return; } bool isArray; //PropertyInfo[] props = o.GetType().GetProperties(); var entitybuftypelist = GetTypeEntityBufType(o.GetType()); //foreach (var tp in entitybuftypelist) Tuple <EntityBufType, bool> tp = null; for (int i = 0; i < entitybuftypelist.Count; i++) { tp = entitybuftypelist[i]; //EntityBufType buftype = MapBufType(prop.PropertyType, out isArray); isArray = tp.Item2; object val = o.Eval(tp.Item1.Property); if (tp.Item1.EntityType == EntityType.COMPLEX) { SerializeComplex(val, isArray, tp.Item1, msWriter); } else { SerializeSimple(val, isArray, tp.Item1, msWriter); } } }
private static void GenSerializeComplex(bool isArray, EntityBufType bufType, MemoryStreamWriter msWriter) { if (isArray) { var len = new Random().Next(1, 3); msWriter.WriteInt32(len); if (len > 0) { for (int i = 0; i < len; i++) { EntityBufTypeFlag flag = EntityBufTypeFlag.Empty; msWriter.WriteByte((byte)flag); GenSerialize(bufType.ValueType, msWriter); } } } else { EntityBufTypeFlag flag = EntityBufTypeFlag.Empty; msWriter.WriteByte((byte)flag); GenSerialize(bufType.ValueType, msWriter); } }
private static object DeSerialize(Type DestType, MemoryStreamReader msReader) { var firstByte = (EntityBufTypeFlag)msReader.ReadByte(); if ((firstByte & EntityBufTypeFlag.VlaueNull) == EntityBufTypeFlag.VlaueNull) { return(null); } //EntityBufType destTypeBufType = MapBufType(DestType, out isArray); Tuple <EntityBufType, bool> touple = GetTypeBufType(DestType); if (touple.Item1.EntityType != EntityBuf.EntityType.COMPLEX) { return(DeserializeSimple(touple.Item1, touple.Item2, msReader)); } bool isArray; object ret = System.Activator.CreateInstance(DestType); //PropertyInfo[] props = DestType.GetProperties(); var buftypelist = GetTypeEntityBufType(DestType); foreach (var buftype in buftypelist) { //EntityBufType buftype = MapBufType(prop.PropertyType, out isArray); isArray = buftype.Item2; if (buftype.Item1.EntityType == EntityType.COMPLEX) { if (isArray) { int len = msReader.ReadInt32(); if (len == -1) { //ret.SetValue(buftype.Item1.Property, null); //ret.SetValueDrect(buftype.Item1.Property, null); continue; } else { object[] objs = (object[])System.Activator.CreateInstance(buftype.Item1.Property.PropertyInfo.PropertyType, len); for (int i = 0; i < len; i++) { //读下标志 EntityBufTypeFlag flag = (EntityBufTypeFlag)msReader.ReadByte(); if ((flag & EntityBufTypeFlag.VlaueNull) == EntityBufTypeFlag.VlaueNull) { objs[i] = null; } else { //string typefullname = string.Format("{0}, {1}", buftype.Item1.Property.PropertyType.FullName.Substring(0, buftype.Item1.Property.PropertyType.FullName.LastIndexOf('[')), //buftype.Item1.Property.PropertyType.Assembly.FullName); //objs[i] = DeSerialize(Type.GetType(typefullname, false, true), msReader); objs[i] = DeSerialize(buftype.Item1.ClassType, msReader); } } if (!object.Equals(objs, buftype.Item1.DefaultValue)) { ret.SetValue(buftype.Item1.Property, objs); } } } else { //byte byte1 = 0; //byte byte2 = 0; //while (true) //{ // byte1 = msReader.ReadByte(); // if (byte1 == complexchar) // { // byte2 = msReader.ReadByte(); // if (byte2 == complexchar) // { // break; // } // } //} //读下标志 EntityBufTypeFlag flag = (EntityBufTypeFlag)msReader.ReadByte(); if ((flag & EntityBufTypeFlag.VlaueNull) == EntityBufTypeFlag.VlaueNull) { //ret.SetValue(buftype.Item1.Property, null); continue; } else { object val = DeSerialize(buftype.Item1.Property.PropertyInfo.PropertyType, msReader); if (!object.Equals(val, buftype.Item1.DefaultValue)) { ret.SetValue(buftype.Item1.Property, val); } } } } else { object val = DeserializeSimple(buftype.Item1, isArray, msReader); if (!object.Equals(val, buftype.Item1.DefaultValue)) { ret.SetValue(buftype.Item1.Property, val); } } } return(ret); }