2017-03-07 50 views
1

我正在使用使用BinaryReader和Writer的Unity3D序列化工具。 用这个工具保存玩家的游戏状态。连续读取和写入的缺点是您必须以相同的顺序读取该文件。软件版本更改BinaryReader的顺序

时,我想新的变量添加到一个类,它打破了读取顺序

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

正如你可以看到,如果我读了之后新的更新程序文件时,它会读取错误的数据或抛出异常acording到流的下一个状态。

有一个临时解决方案,我首先写文件版本。和阅读该版本确定什么将我在下一步阅读

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

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

谢谢。

回答

0

我们对每条消息都使用版本控制。我们的服务器端并不确定客户端是否更新,所以我们总是可以从客户端获取旧版本,但只要并非所有客户端都已更新,我们仍然必须支持这些旧版本。

就你而言,你似乎确信你只需要支持一个版本。因此,您可以在更新游戏时更新所有玩家设置。阅读设置,添加一个额外的默认值并再次保存。这样你只需要支持一个版本。

+0

游戏初始化时。如果存在,请查找保存文件。成功后,它正在加载。在我的情况下,如果播放器不触发写入方法,它将按照用户拥有的最新版本顺序读取。所以即使经过5次修改,当用户回来时它正在正确读取 – Lordinarius