【发布时间】: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