/// <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]); } }
internal DeserializeCell(DeserializeBase des) { this._des = des; }