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