コード例 #1
0
        /// <summary>
        /// 根据类型反序列化,会通过反射创建对象,并将其返回
        /// </summary>
        /// <returns></returns>
        internal object _Deserialize(MyStream stream, Type type)
        {
            if (!deserializeMap.ContainsKey(type))
            {
                throw new Exception("Type has not been regist : " + type);
            }

            if (typeof(ISerObj).IsAssignableFrom(type))
            {
                object          result = type.Assembly.CreateInstance(type.FullName);
                IDeserializable des    = deserializeMap[type];
                des.Deserialize(stream, result);
                return(result);
            }
            else
            {
                DeserializeCell des = deserializeMap[type] as DeserializeCell;
                return(des.GetDeserializeValue(stream));
            }
        }
コード例 #2
0
        /// <summary>
        /// 添加需要被序列化的对象类型
        /// </summary>
        /// <param name="type"></param>
        void AddClass(Type type)
        {
            if (serializeMap.ContainsKey(type))
            {
                return;
            }

            if (!typeof(ISerObj).IsAssignableFrom(type))
            {
                throw new Exception("AddClass type must be a subclass of interface 'ISerObj'");
            }

            List <Type> newAddTyps = new List <Type>();

            FieldInfo[] allField = type.GetFields(BindingFlags.Public | BindingFlags.Instance);

            SerializeBase[]   sbArray = new SerializeBase[allField.Length];
            DeserializeBase[] dbArray = new DeserializeBase[allField.Length];
            for (int i = 0; i < allField.Length; i++)
            {
                Type fieldType = allField[i].FieldType;
                if (fieldType == typeof(int))
                {
                    sbArray[i] = new SerializeInt(allField[i]);
                    dbArray[i] = new DeserializeInt(allField[i]);
                }
                else if (fieldType == typeof(string))
                {
                    sbArray[i] = new SerializeString(allField[i]);
                    dbArray[i] = new DeserializeString(allField[i]);
                }
                else if (fieldType == typeof(byte))
                {
                    sbArray[i] = new SerializeByte(allField[i]);
                    dbArray[i] = new DeserializeByte(allField[i]);
                }
                else if (fieldType == typeof(float))
                {
                    sbArray[i] = new SerializeFloat(allField[i]);
                    dbArray[i] = new DeserializeFloat(allField[i]);
                }
                else if (typeof(ISerObj).IsAssignableFrom(fieldType))
                {
                    sbArray[i] = new SerializeObj(allField[i]);
                    dbArray[i] = new DeserializeObj(allField[i]);
                    if (!newAddTyps.Contains(fieldType))
                    {
                        newAddTyps.Add(fieldType);
                    }
                    //这里没有调用AddClass,而是添加到一个列表中,在serializeMap中成功添加后,才处理递归AddClass
                    //防止在发生类型嵌套(A包含B,B包含A)时出现AddClass递归死循环,
                    //AddClass(fieldType);
                }
                else if (fieldType.IsArray)
                {
                    sbArray[i] = new SerializeArray(allField[i]);
                    dbArray[i] = new DeserializeArray(allField[i]);
                    Type eleType = fieldType.GetElementType();
                    if (typeof(ISerObj).IsAssignableFrom(eleType))
                    {
                        if (!newAddTyps.Contains(eleType))
                        {
                            newAddTyps.Add(eleType);
                        }
                    }
                }
                else
                {
                    throw new Exception("Can't serialize type -->" + allField[i].FieldType.ToString());
                }
            }
            ISerializable   ser;
            IDeserializable des;

            if (sbArray.Length == 1)
            {
                ser = new SerializeCell(sbArray[0]);
                des = new DeserializeCell(dbArray[0]);
            }
            else
            {
                ser = new SerializeUnit(sbArray);
                des = new DeserializeUnit(dbArray);
            }
            serializeMap.Add(type, ser);
            deserializeMap.Add(type, des);

            for (int i = 0; i < newAddTyps.Count; i++)
            {
                AddClass(newAddTyps[i]);
            }
        }