private static object DeserializeObject(BitConverterEx converter, object instance, List <FieldInfo> fields, bool useBigEnum) { try { foreach (FieldInfo field in fields) { Type fieldType = field.FieldType; if (fieldType == byteType) { field.SetValue(instance, converter.PopByte()); } else if (fieldType == boolType) { field.SetValue(instance, converter.PopBoolean()); } else if (fieldType == shortType) { field.SetValue(instance, converter.PopShort()); } else if (fieldType == intType) { field.SetValue(instance, converter.PopInteger()); } else if (fieldType == longType) { field.SetValue(instance, converter.PopLong()); } else if (fieldType == floatType) { field.SetValue(instance, converter.PopFloat()); } else if (fieldType == doubleType) { field.SetValue(instance, converter.PopDouble()); } else if (fieldType == stringType) { field.SetValue(instance, converter.PopString()); } else if (fieldType.IsEnum) { if (useBigEnum) { field.SetValue(instance, converter.PopInteger()); } else { field.SetValue(instance, converter.PopByte()); } } else if (fieldType.IsArray) { Type elemType = fieldType.GetElementType(); if (elemType == byteType) { field.SetValue(instance, converter.PopByteArray()); } else if (elemType == boolType) { field.SetValue(instance, converter.PopBooleanArray()); } else if (elemType == shortType) { field.SetValue(instance, converter.PopShortArray()); } else if (elemType == intType) { field.SetValue(instance, converter.PopIntegerArray()); } else if (elemType == longType) { field.SetValue(instance, converter.PopLongArray()); } else if (elemType == floatType) { field.SetValue(instance, converter.PopFloatArray()); } else if (elemType == doubleType) { field.SetValue(instance, converter.PopDoubleArray()); } else if (elemType == stringType) { field.SetValue(instance, converter.PopStringArray()); } else if (elemType.IsEnum) { int arraySize = (ushort)converter.PopShort(); Array array = Array.CreateInstance(elemType, arraySize); for (int i = 0; i < arraySize; ++i) { if (useBigEnum) { array.SetValue(converter.PopInteger(), i); } else { array.SetValue(converter.PopByte(), i); } } field.SetValue(instance, array); } else if (elemType.IsClass || elemType.IsValueType) { int arraySize = (ushort)converter.PopShort(); Array array = Array.CreateInstance(elemType, arraySize); List <FieldInfo> subFields = null; if (tempFieldListPool.Count > 0) { subFields = tempFieldListPool.Dequeue(); } else { subFields = new List <FieldInfo>(); } if (FindAllFields(elemType, ref subFields)) { for (int i = 0; i < arraySize; ++i) { object o = Activator.CreateInstance(elemType); DeserializeObject(converter, o, subFields, useBigEnum); array.SetValue(o, i); } } subFields.Clear(); tempFieldListPool.Enqueue(subFields); field.SetValue(instance, array); } } else if (fieldType.IsClass || fieldType.IsValueType) { object o = Activator.CreateInstance(fieldType); List <FieldInfo> subFields = null; if (tempFieldListPool.Count > 0) { subFields = tempFieldListPool.Dequeue(); } else { subFields = new List <FieldInfo>(); } if (FindAllFields(fieldType, ref subFields)) { DeserializeObject(converter, o, subFields, useBigEnum); } subFields.Clear(); tempFieldListPool.Enqueue(subFields); field.SetValue(instance, o); } } } catch (Exception ex) { if (LogUtil.ShowError != null) { LogUtil.ShowError(string.Format("DeserializeObject Exception at {0}\n{1}", instance.GetType().Name, ex.Message)); } } return(instance); }