コード例 #1
0
 public static BinaryClassChunk DeserializeHeader(
     System.Type t,
     BitBuffer data,
     BinaryClassChunk target = null,
     bool root     = true,
     bool skipData = false)
 {
     if (target == null)
     {
         target = Activator.CreateInstance(t, (object[])null) as BinaryClassChunk;
     }
     try
     {
         long num1 = 0;
         if (root)
         {
             num1 = data.ReadLong();
             if (num1 != BinaryClassChunk.MagicNumber(t) && num1 != 5033950674723417L)
             {
                 target._result = DeserializeResult.InvalidMagicNumber;
                 return(target);
             }
             target._checksum = data.ReadUInt();
         }
         ushort num2 = data.ReadUShort();
         ushort num3 = BinaryClassChunk.ChunkVersion(t);
         if ((int)num2 != (int)num3 && (!(target is LevelData) || num2 != (ushort)2))
         {
             target._result = (int)num2 <= (int)num3 ? DeserializeResult.FileVersionTooOld : DeserializeResult.FileVersionTooNew;
             return(target);
         }
         if (num2 == (ushort)2 && target is LevelData && data.ReadBool())
         {
             BinaryClassChunk binaryClassChunk = BinaryClassChunk.DeserializeHeader(Editor.GetType(data.ReadString()), data, root: false);
             if (binaryClassChunk != null && binaryClassChunk._result == DeserializeResult.HeaderDeserialized)
             {
                 binaryClassChunk.Deserialize();
                 target._headerDictionary["metaData"] = binaryClassChunk;
             }
         }
         target._magicNumber = num1;
         target._version     = num2;
         target._size        = data.ReadUInt();
         target._offset      = (uint)data.position;
         target._data        = data;
         target._result      = DeserializeResult.HeaderDeserialized;
         if (skipData)
         {
             data.position = (int)target._offset + (int)target._size;
         }
         return(target);
     }
     catch (Exception ex)
     {
         target._exception = ex;
         target._result    = DeserializeResult.ExceptionThrown;
         return(target);
     }
 }
コード例 #2
0
 public static long MagicNumber <T>() => BinaryClassChunk.MagicNumber(typeof(T));
コード例 #3
0
        public BitBuffer Serialize(BitBuffer data = null, bool root = true)
        {
            if (data == null)
            {
                data = new BitBuffer(false);
            }
            this._serializedData = data;
            if (data.allowPacking)
            {
                throw new Exception("This class does not support serialization with a packed bit buffer. Construct the buffer with allowPacking set to false.");
            }
            System.Type              type1   = this.GetType();
            List <ClassMember>       members = Editor.GetMembers(type1);
            List <BinaryClassMember> binaryClassMemberList = new List <BinaryClassMember>();

            foreach (ClassMember classMember in members)
            {
                if (!classMember.isPrivate && (classMember.type.IsEnum || classMember.type.IsPrimitive || (classMember.type.Equals(typeof(string)) || typeof(BinaryClassChunk).IsAssignableFrom(classMember.type)) || classMember.type.IsArray || classMember.type.IsGenericType && (classMember.type.GetGenericTypeDefinition() == typeof(List <>) || classMember.type.GetGenericTypeDefinition() == typeof(HashSet <>))))
                {
                    object obj = classMember.GetValue((object)this);
                    if (classMember.type.IsEnum)
                    {
                        obj = (object)(int)obj;
                    }
                    if (obj != null)
                    {
                        BinaryClassMember binaryClassMember = new BinaryClassMember()
                        {
                            name = classMember.name,
                            data = obj
                        };
                        binaryClassMemberList.Add(binaryClassMember);
                    }
                }
            }
            if (this._extraProperties != null)
            {
                foreach (KeyValuePair <string, List <object> > extraProperty in (MultiMap <string, object, List <object> >) this._extraProperties)
                {
                    if (extraProperty.Value != null)
                    {
                        foreach (object obj1 in extraProperty.Value)
                        {
                            object obj2 = obj1;
                            if (obj2.GetType().IsEnum)
                            {
                                obj2 = (object)(int)obj2;
                            }
                            BinaryClassMember binaryClassMember = new BinaryClassMember()
                            {
                                name  = "@" + extraProperty.Key,
                                data  = obj2,
                                extra = true
                            };
                            binaryClassMemberList.Add(binaryClassMember);
                        }
                    }
                }
            }
            if (root)
            {
                long val = BinaryClassChunk.MagicNumber(type1);
                data.Write(val);
                data.Write(0U);
            }
            data.Write(BinaryClassChunk.ChunkVersion(type1));
            int position1 = data.position;

            data.Write(0U);
            data.Write((ushort)binaryClassMemberList.Count);
            foreach (BinaryClassMember binaryClassMember in binaryClassMemberList)
            {
                data.Write(binaryClassMember.name);
                if (binaryClassMember.extra)
                {
                    byte        val   = 0;
                    System.Type type2 = binaryClassMember.data.GetType();
                    if (BinaryClassMember.typeMap.TryGetValue(type2, out val))
                    {
                        val = (byte)((int)val << 1 | 1);
                    }
                    data.Write(val);
                    if (val == (byte)0)
                    {
                        data.Write(ModLoader.SmallTypeName(type2));
                    }
                }
                int position2 = data.position;
                data.Write(0U);
                if (binaryClassMember.data is BinaryClassChunk)
                {
                    (binaryClassMember.data as BinaryClassChunk).Serialize(data, false);
                }
                else if (binaryClassMember.data is Array)
                {
                    this.SerializeArray(binaryClassMember.data as Array, binaryClassMember.data.GetType().GetElementType(), data);
                }
                else if (binaryClassMember.data.GetType().IsGenericType&& binaryClassMember.data.GetType().GetGenericTypeDefinition() == typeof(List <>))
                {
                    IList data1 = binaryClassMember.data as IList;
                    Array array = (Array) new object[data1.Count];
                    data1.CopyTo(array, 0);
                    this.SerializeArray(array, binaryClassMember.data.GetType().GetGenericArguments()[0], data);
                }
                else if (binaryClassMember.data.GetType().IsGenericType&& binaryClassMember.data.GetType().GetGenericTypeDefinition() == typeof(HashSet <>))
                {
                    IEnumerable   data1      = binaryClassMember.data as IEnumerable;
                    List <object> objectList = new List <object>();
                    foreach (object obj in data1)
                    {
                        objectList.Add(obj);
                    }
                    object[] array = new object[objectList.Count];
                    objectList.CopyTo(array, 0);
                    this.SerializeArray((Array)array, binaryClassMember.data.GetType().GetGenericArguments()[0], data);
                }
                else
                {
                    data.Write(binaryClassMember.data);
                }
                int position3 = data.position;
                data.position = position2;
                data.Write((uint)(position3 - position2 - 4));
                data.position = position3;
            }
            int position4 = data.position;

            data.position = position1;
            data.Write((uint)(position4 - position1 - 4));
            if (root)
            {
                this._checksum = Editor.Checksum(data.buffer);
                data.position  = 8;
                data.Write(this._checksum);
            }
            data.position = position4;
            return(data);
        }