5

给一点背景。

我创建了一个应用程序,允许用户保存设置,然后在以后调用设置。为此,我创建了一些可序列化的对象。我已经使用 BinaryFormatter 轻松完成了这项工作。

当我升级软件并添加新设置时,我开始遇到问题。现在我的可序列化对象不匹配,所以我必须更新文件。我已经成功完成了几个版本。但要做到这一点,我尝试反序列化文件,如果它引发异常,我尝试使用下一个版本。. .然后是下一个。. .然后是下一个。. . 直到我找到合适的。然后我必须为每个旧版本编写转换函数以将其转换为最新版本。我也创建了一个“修订”文件,所以我可以先检查他们有什么版本然后升级它,但我仍然必须保持很多不同的“版本”并为它们编写转换函数. . . 如果我继续走这条路,这对我来说似乎天生就很混乱,而且以后很容易膨胀。

必须有更好的方法来做到这一点,我只是不确定如何。

谢谢

4

6 回答 6

3

您需要编写序列化绑定程序来解析程序集。

对于设置,我使用 aDictionary<string, byte[]>保存到文件。我序列化了字典,一切都很好。添加新设置时,如果在设置文件中找不到,我会提供默认设置。

此外,如果您要向序列化对象添加字段,则可以使用 [Optional] 进行装饰。

于 2013-02-19T22:00:27.663 回答
2

这正是设置类的用途。您在 app.config 中定义默认值,然后用户可以更改它们,当您保存时,他们的更改将保存到其用户配置文件中的某个位置。当您阅读它们时,您只会得到修改后的设置。

此链接适用于 VS 2005,但它在 VS 2012 中的工作方式完全相同:http: //msdn.microsoft.com/en-us/library/aa730869 (v=vs.80).aspx

找到 VS2012 的链接:http: //msdn.microsoft.com/EN-US/library/k4s6c3a0 (v=VS.110,d=hv.2).aspx

于 2013-02-19T22:49:58.937 回答
1

XML 格式适用于这种情况。您将在非常早期版本的设置文件中找到必要的旧设置。甚至旧版本也可以处理从新版本创建的 XML 设置。它不能“自动”工作,即使用 Serialize/Deserialize 之类的方法,但编写转换函数并不容易或更快。

于 2014-10-27T15:23:25.853 回答
0

实际上,这可以通过将[DefaultValue()]属性添加到设置对象的较新属性来完成 - 至少对于 XML 序列化。我没有尝试过使用二进制序列化。对于 xml,这意味着它们是“可选的”,并且在加载旧版本的文件时序列化不会中断。您可以在命名空间中找到此属性System.ComponentModel

class MySettings
{
    public int MaxNumLogins { get; set; }

    // specify the value to default to if it's not present in the serialized file...
    [DefaultValue(0)]
    public int CacheTimeoutMinutes { get; set; }
}
于 2013-02-19T22:08:48.427 回答
0

除了像其他人建议的那样命名字段之外,这种事情只是需要版本号。

于 2013-02-19T22:46:00.677 回答
0

如果你正在做二进制,你可以看看 ProtoBuf-Net http://code.google.com/p/protobuf-net/wiki/GettingStarted,因为所有这些都涉及到版本控制等。它也非常紧凑。它也在积极开发中,如果您使用 .proto 文件可能有跨平台需求,您也可以实现这一点。

如果您希望人们能够编辑设置(在您的程序之外),那么您可以使用 XML* 序列化方法。

于 2013-02-19T23:03:26.253 回答