/// <summary>
 ///
 /// </summary>
 /// <param name="type1"></param>
 /// <returns></returns>
 private CompactPropertySerializeCache GetSerializeCache(Type type1)
 {
     lock (this._dicCache)
     {
         if (this._dicCache.ContainsKey(type1))
         {
             return(this._dicCache[type1]);
         }
         IPropertyQuicker    quicker = PropertyQuickerFactory.CreatePropertyQuicker(type1);
         List <PropertyInfo> list    = new List <PropertyInfo>();
         foreach (PropertyInfo info in type1.GetProperties())
         {
             if (info.CanRead && info.CanWrite)
             {
                 list.Add(info);
             }
         }
         if (_ComparisonProperty == null)
         {
             _ComparisonProperty = new Comparison <PropertyInfo>(CompactPropertySerializer.CompareToName);
         }
         list.Sort(_ComparisonProperty);
         CompactPropertySerializeCache cache = new CompactPropertySerializeCache(quicker, list.ToArray());
         this._dicCache.Add(type1, cache);
         return(cache);
     }
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="baseType"></param>
        /// <param name="type"></param>
        /// <param name="buff"></param>
        /// <param name="offset"></param>
        /// <returns></returns>
        protected override object DoDeserializeComplicatedType(Type baseType, Type type, byte[] buff, ref int offset)
        {
            //int offset3 = 37;
            int    num  = ByteConverter.Parse <int>(buff, ref offset);
            object obj2 = null;

            if (num > -1)
            {
                obj2 = Activator.CreateInstance(type);
                Type singleType = base.GetBaseType(type);
                if (base.IsGenericTypeList(singleType))//继承List<>类
                {
                    IList list = base.DeserializeList(baseType, buff, ref offset, singleType, num);
                    foreach (object item in list)
                    {
                        ((IList)obj2).Add(item);
                    }
                }
                else if (base.IsGenericTypeDictionary(singleType))//继承List<>类
                {
                    IDictionary list = base.DeserializeDictionary(baseType, buff, ref offset, singleType, num);
                    foreach (object keys in list.Keys)
                    {
                        ((IDictionary)obj2).Add(keys, list[keys]);
                    }
                }
                else if (singleType.IsArray)//继承Array类型
                {
                    obj2 = base.DeserializeArray(baseType, buff, ref offset, singleType, num);
                }
                else
                {
                    CompactPropertySerializeCache cache = this.GetSerializeCache(type);
                    for (int i = 0; i < cache.PropertyArray.Length; i++)
                    {
                        object obj3 = base.DoDeserialize(baseType, cache.PropertyArray[i].PropertyType, string.Empty, buff, ref offset);
                        this.SetPropertyValue(type, cache.PropertyQuicker, obj2, cache.PropertyArray[i].Name, obj3);
                    }
                }
            }
            return(obj2);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="type"></param>
 /// <param name="obj"></param>
 /// <param name="stream"></param>
 protected override void DoSerializeComplicatedType(Type type, object obj, MemoryStream stream)
 {
     if (obj == null)
     {
         byte[] buffer = ByteConverter.ToBytes <int>(-1);
         stream.Write(buffer, 0, buffer.Length);
     }
     else
     {
         Type baseType = base.GetBaseType(type);
         if (base.IsGenericTypeList(baseType))//继承List<>类
         {
             base.SerializeList(stream, obj, baseType);
         }
         else if (base.IsGenericTypeDictionary(baseType))
         {
             base.SerializeDictionary(stream, obj, baseType);
         }
         else if (baseType.IsArray)
         {
             base.SerializeArray(stream, obj, baseType);
         }
         else
         {
             CompactPropertySerializeCache cache = this.GetSerializeCache(type);
             MemoryStream stream2 = new MemoryStream();
             for (int i = 0; i < cache.PropertyArray.Length; i++)
             {
                 object obj2 = cache.PropertyQuicker.GetValue(obj, cache.PropertyArray[i].Name);
                 base.DoSerialize(stream2, cache.PropertyArray[i].PropertyType, obj2);
             }
             byte[] buffer2 = stream2.ToArray();
             byte[] buffer3 = ByteConverter.ToBytes <int>(buffer2.Length);
             stream.Write(buffer3, 0, buffer3.Length);
             stream.Write(buffer2, 0, buffer2.Length);
         }
     }
 }