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); } }
public static long MagicNumber <T>() => BinaryClassChunk.MagicNumber(typeof(T));
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); }