/// <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)); } }
/// <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]); } }