Изменение последовательности BinaryReader после выпуска программного обеспечения

Я использую инструмент сериализации 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>();
    }
}

Я ищу более достойное решение, если у вас есть.

Спасибо.


person Lordinarius    schedule 07.03.2017    source источник


Ответы (1)


Мы сами используем управление версиями для каждого сообщения, которое получаем. Наша серверная сторона никогда не уверена, обновлен ли клиент, поэтому мы всегда можем получить старые версии от клиента, которые нам все еще нужно поддерживать, пока не все клиенты обновлены.

В вашем случае вы, кажется, уверены, что вам нужно поддерживать только одну версию. Поэтому вы можете обновить все настройки плеера при обновлении игры. Прочтите настройки, добавьте дополнительное значение по умолчанию и снова сохраните их. Таким образом, вам нужно поддерживать только одну версию.

person Carra    schedule 07.03.2017
comment
При инициализации игры. Ищем файл сохранения, если он есть. После успешного завершения загрузки. В моем случае, если проигрыватель не запускает метод Write, он будет читать в последней версии, которую имеет пользователь. Таким образом, даже после 5 ревизий, когда пользователь возвращается, он читает правильно. - person Lordinarius; 07.03.2017