public void Serialize(object obj, ExtendedBinaryWriter writer, Type objType = null) { if (obj == null) { throw new ArgumentNullException("valueObj cannot be null"); } if (objType == null) { objType = obj.GetType(); } if (objType.IsArray) { Type elemType = objType.GetElementType(); var arrayObj = obj as Array; int length = arrayObj.Length; writer.AlignStream(); writer.Write(length); if (elemType == typeof(Byte)) { writer.Write(obj as byte[]); writer.AlignStream(); } else if (elemType.IsValueType) { foreach (object element in arrayObj) { WriteValueType(element, writer, objType, noAlign: true); } writer.AlignStream(); } else { foreach (object element in arrayObj) { Serialize(element, writer); } } } else if (objType.IsEnum) { var enumType = Enum.GetUnderlyingType(objType); WriteValueType(obj, writer, enumType); } else if (objType.IsValueType) { WriteValueType(obj, writer, objType); } else if (objType == typeof(string)) { writer.AlignStream(); writer.WriteAlignedString(obj as string); } else if (objType.IsGenericType && objType.GetGenericTypeDefinition() == typeof(List <>)) { Type elemType = objType.GetGenericArguments()[0]; var listObj = obj as IList; int length = listObj.Count; writer.AlignStream(); writer.Write(length); if (elemType.IsValueType) { foreach (object element in listObj) { WriteValueType(element, writer, elemType, noAlign: true); } } else { foreach (object element in listObj) { Serialize(element, writer); } } } else if (objType.IsClass) { if (!Attribute.IsDefined(objType, typeof(UnitySerializableAttribute))) { throw new Exception("not serializable type : " + objType.ToString()); } if (Attribute.IsDefined(objType.BaseType, typeof(UnitySerializableAttribute))) { Serialize(obj, writer, objType.BaseType); } foreach (var field in objType.GetFields()) { if (!field.DeclaringType.Equals(objType)) { continue; } var fieldValue = field.GetValue(obj); var fieldType = field.FieldType; if (fieldType.IsEnum) { var enumType = Enum.GetUnderlyingType(fieldType); WriteValueType(fieldValue, writer, enumType); } else if (fieldType.IsValueType) { WriteValueType(fieldValue, writer, fieldType, Attribute.IsDefined(field, typeof(UnityDoNotAlignAttribute))); } else { Serialize(fieldValue, writer); } } } writer.AlignStream(); }