软件发布后更改BinaryReader的顺序

时间:2017-03-07 07:53:10

标签: c# unity3d binaryreader binarywriter

我使用的是使用BinaryReader和Writer的Unity3D序列化工具。 使用此工具保存玩家游戏状态。顺序读写的缺点是您必须以相同的顺序读取该文件。

当我想向类中添加新变量时,它会破坏读取顺序

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>();
    }
}

如果你有,我正在寻找更合适的解决方案。

感谢。

1 个答案:

答案 0 :(得分:0)

我们自己为每条消息使用版本控制。我们的服务器端无法确定客户端是否已更新,因此我们始终可以从客户端获取旧版本,只要不是所有客户端都更新,我们仍然需要支持。

在您的情况下,您似乎确信您只需要支持一个版本。因此,您可以在更新游戏时更新所有播放器设置。阅读设置,添加一个额外的默认值并再次保存。这样您只需支持一个版本。