Я использую инструмент сериализации Unity3D, который использует BinaryReader и Writer. Сохранение состояния игры игроков с помощью этого инструмента. Недостатком последовательного чтения и записи является то, что вы должны всегда читать этот файл в одном и том же порядке.
Когда я хочу добавить новую переменную в класс, она нарушает порядок чтения
public override void Write(object obj, ES2Writer writer)
{
SettingsBrigde data = (SettingsBrigde)obj;
writer.Write(data.FxVolume);
writer.Write(data.MusicVolume);
writer.Write(data.shadow);
writer.Write(data.isBaterySave);
writer.Write(data.controllerType);
writer.Write(data.qualityPreset);
//New variables after game release
writer.Write(data.mynewvariable);
}
public override void Read(ES2Reader reader, object c)
{
SettingsBrigde data = (SettingsBrigde)c;
data.FxVolume = reader.Read<System.Single>();
data.MusicVolume = reader.Read<System.Single>();
data.shadow = reader.Read<System.Boolean>();
data.isBaterySave = reader.Read<System.Boolean>();
data.controllerType = reader.Read<TouchInputLayout>();
data.qualityPreset = reader.Read<QualitySetttingsOptions>();
//New variables after game release
data.mynewvariable = reader.Read<System.Single>();
}
Как видите, если я прочитаю этот файл после нового обновления, он прочитает неправильные данные или выдаст исключение в соответствии со следующим состоянием потока.
Есть временное решение, сначала пишу файловую версию. И чтение этой версии, чтобы определить, что я прочитаю на следующем шаге.
public override void Write(object obj, ES2Writer writer)
{
fileVersion = 2;
SettingsBrigde data = (SettingsBrigde)obj;
writer.Write(fileVersion);
writer.Write(data.FxVolume);
writer.Write(data.MusicVolume);
writer.Write(data.shadow);
writer.Write(data.isBaterySave);
writer.Write(data.controllerType);
writer.Write(data.qualityPreset);
//New variables after game release
writer.Write(data.mynewvariable);
}
public override void Read(ES2Reader reader, object c)
{
SettingsBrigde data = (SettingsBrigde)c;
int currentVersion = reader.Read<System.Int32>();
data.FxVolume = reader.Read<System.Single>();
data.MusicVolume = reader.Read<System.Single>();
data.shadow = reader.Read<System.Boolean>();
data.isBaterySave = reader.Read<System.Boolean>();
data.controllerType = reader.Read<TouchInputLayout>();
data.qualityPreset = reader.Read<QualitySetttingsOptions>();
//New variables after game release
if (currentVersion == 2)
{
data.mynewvariable = reader.Read<System.Single>();
}
}
Я ищу более достойное решение, если у вас есть.
Спасибо.