public bool Deserialize()
{
_BeginOffset = _Buffer.Position;
Name = _Buffer.ReadNameReference();
_Container.Record("Name", Name);
if (Name.IsNone())
{
return(false);
}
// Unreal Engine 1 and 2
if (_Buffer.Version < V3)
{
const byte typeMask = 0x0F;
const byte sizeMask = 0x70;
// Packed byte
var info = _Buffer.ReadByte();
_Container.Record(String.Format(
"Info(Type={0},SizeMask=0x{1:X2},ArrayIndexMask=0x{2:X2})",
(PropertyType)(byte)(info & typeMask),
(byte)(info & sizeMask),
(info & ArrayIndexMask)
), info
);
Type = (PropertyType)(byte)(info & typeMask);
if (Type == PropertyType.StructProperty)
{
ItemName = _Buffer.ReadNameReference();
_Container.Record("ItemName", ItemName);
}
Size = DeserializeSize((byte)(info & sizeMask));
if (Size >= 0x50)
{
_Container.Record("Size", Size);
}
switch (Type)
{
case PropertyType.BoolProperty:
_BoolValue = (info & ArrayIndexMask) != 0;
break;
default:
if ((info & ArrayIndexMask) != 0)
{
ArrayIndex = DeserializeArrayIndex();
_Container.Record("ArrayIndex", ArrayIndex);
}
break;
}
}
// Unreal Engine 3
else
{
string typeName = _Buffer.ReadName();
_Container.Record("typeName", typeName);
Type = (PropertyType)Enum.Parse(typeof(PropertyType), typeName);
Size = _Buffer.ReadInt32();
_Container.Record("Size", Size);
ArrayIndex = _Buffer.ReadInt32();
_Container.Record("ArrayIndex", ArrayIndex);
switch (Type)
{
case PropertyType.StructProperty:
ItemName = _Buffer.ReadNameReference();
_Container.Record("ItemName", ItemName);
break;
case PropertyType.ByteProperty:
if (_Buffer.Version >= VEnumName)
{
EnumName = _Buffer.ReadNameReference();
_Container.Record("EnumName", EnumName);
}
break;
case PropertyType.BoolProperty:
_BoolValue = _Buffer.Version >= VBoolSizeToOne?_Buffer.ReadByte() > 0 : _Buffer.ReadInt32() > 0;
_Container.Record("_BoolValue", _BoolValue);
break;
}
}
_ValueOffset = _Buffer.Position;
try
{
DeserializeValue();
}
finally
{
// Even if something goes wrong, we can still skip everything and safely deserialize the next property if any!
_Buffer.Position = _EndOffset;
}
return(true);
}