Я написал несколько универсальный механизм десериализации, который позволяет мне создавать объекты из двоичного формата файла, используемого приложением C ++.
Чтобы сохранить вещи в чистоте и их легко было изменить, я создал класс Field
, которыйextends Attribute
, создается с Field(int offset, string type, int length, int padding)
и применяется к атрибутам класса, которые я хочу десериализовать.Вот как это выглядит:
[Field(0x04, "int")]
public int ID = 0;
[Field(0x08, "string", 0x48)]
public string Name = "0";
[Field(0x6C, "byte", 3)]
public byte[] Color = { 0, 0, 0 };
[Field(0x70, "int")]
public int BackgroundSoundEffect = 0;
[Field(0x74, "byte", 3)]
public byte[] BackgroundColor = { 0, 0, 0 };
[Field(0x78, "byte", 3)]
public byte[] BackgroundLightPower = { 0, 0, 0 };
[Field(0x7C, "float", 3)]
public float[] BackgroundLightAngle = { 0.0f, 0.0f, 0.0f };
Вызов myClass.Decompile(pathToBinaryFile)
затем извлечет данные из файла, считывая правильные типы и размеры с правильными смещениями.
Однако я нахожучто передача имени типа в виде строки ужасна.
Можно ли передать тип более элегантным, но коротким способом, и как?
Спасибо.