110 lines
3.1 KiB
C#
110 lines
3.1 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
|
|
namespace AddressablesTools.Catalog
|
|
{
|
|
internal static class SerializedObjectDecoder
|
|
{
|
|
internal enum ObjectType
|
|
{
|
|
AsciiString,
|
|
UnicodeString,
|
|
UInt16,
|
|
UInt32,
|
|
Int32,
|
|
Hash128,
|
|
Type,
|
|
JsonObject
|
|
}
|
|
|
|
internal static object Decode(BinaryReader br)
|
|
{
|
|
ObjectType type = (ObjectType)br.ReadByte();
|
|
|
|
switch (type)
|
|
{
|
|
case ObjectType.AsciiString:
|
|
{
|
|
string str = ReadString4(br);
|
|
return str;
|
|
}
|
|
|
|
case ObjectType.UnicodeString:
|
|
{
|
|
string str = ReadString4Unicode(br);
|
|
return str;
|
|
}
|
|
|
|
case ObjectType.UInt16:
|
|
{
|
|
return br.ReadUInt16();
|
|
}
|
|
|
|
case ObjectType.UInt32:
|
|
{
|
|
return br.ReadUInt32();
|
|
}
|
|
|
|
case ObjectType.Int32:
|
|
{
|
|
return br.ReadInt32();
|
|
}
|
|
|
|
case ObjectType.Hash128:
|
|
{
|
|
// read as string for now
|
|
string str = ReadString1(br);
|
|
return str;
|
|
}
|
|
|
|
case ObjectType.Type:
|
|
{
|
|
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
throw new NotSupportedException($"{nameof(ObjectType)}.{nameof(ObjectType.Type)} is only supported on windows because it uses {nameof(Type.GetTypeFromCLSID)}");
|
|
}
|
|
string str = ReadString1(br);
|
|
return Type.GetTypeFromCLSID(new Guid(str));
|
|
}
|
|
|
|
case ObjectType.JsonObject:
|
|
{
|
|
string assemblyName = ReadString1(br);
|
|
string className = ReadString1(br);
|
|
string jsonText = ReadString4Unicode(br);
|
|
ClassJsonObject jsonObj = new ClassJsonObject(assemblyName, className, jsonText);
|
|
return jsonObj;
|
|
}
|
|
|
|
default:
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static string ReadString1(BinaryReader br)
|
|
{
|
|
int length = br.ReadByte();
|
|
string str = Encoding.ASCII.GetString(br.ReadBytes(length));
|
|
return str;
|
|
}
|
|
|
|
private static string ReadString4(BinaryReader br)
|
|
{
|
|
int length = br.ReadInt32();
|
|
string str = Encoding.ASCII.GetString(br.ReadBytes(length));
|
|
return str;
|
|
}
|
|
|
|
private static string ReadString4Unicode(BinaryReader br)
|
|
{
|
|
int length = br.ReadInt32();
|
|
string str = Encoding.Unicode.GetString(br.ReadBytes(length));
|
|
return str;
|
|
}
|
|
}
|
|
}
|