【问题标题】:Changing sequence of BinaryReader after software release软件发布后更改 BinaryReader 的顺序
【发布时间】:2017-03-07 07:53:09
【问题描述】:

我正在使用一个使用 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>();
    }
}

如果你有的话,我正在寻找更体面的解决方案。

谢谢。

【问题讨论】:

    标签: c# unity3d binaryreader binarywriter


    【解决方案1】:

    我们对收到的每条消息都使用版本控制。我们的服务器端永远无法确定客户端是否已更新,因此我们始终可以从客户端获取旧版本,只要不是所有客户端都更新,我们仍然必须支持这些版本。

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

    【讨论】:

    • 游戏初始化时。寻找保存文件(如果存在)。成功后正在加载。在我的情况下,如果播放器没有触发 Write 方法,它将按照用户拥有的最后一个版本顺序读取。因此,即使在用户回来进行 5 次修订后,它也能正常阅读
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多