示例#1
0
        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();
        }