替代XML序列化配置

目前,我们使用一个与XML序列化的巨型配置对象。 这在大多数情况下运行良好,但我们发现在断电和应用程序崩溃的情况下,文件可能会处于使其无法正确反序列化的状态,从而有效地破坏配置信息。

我想使用内置的app.config,但它似乎不容易支持自定义类。 例如,使用XML序列化,我可以轻松地序列化通用list而无需额外的代码。 它只是有效。 似乎在使用app.config时,您必须提供大量信息和自定义类才能使用。 此外,大多数“自定义配置”教程大约来自2007年,可能已经过时了。 有没有人有关于在.NET 4.0中执行此操作的最新方法的信息?

另外,当应用程序出现问题时,由于配置不正确而导致9/10次。 App.config喜欢将用户可更改的设置存储在非常难以访问的位置,供不熟悉隐藏目录等的用户使用。 有没有办法让一个位置存储配置文件,用户可以在出现问题时轻松给我们发电子邮件?

或者,这是否比我记得它在2.0天的早期更容易? 有关如何轻松执行自定义app.config信息的任何链接或快速示例都会很棒。

作为另一个例子,这是我希望序列化为List的一种对象类型的精简版本,因为List的数量可以变化或为空。 有没有类似的方法在app.config中存储这样的东西?

 [Serializable] public class Alarm { [Serializable] public class AlarmSetting { public enum AlarmVariables { Concentration, RSquared } public enum AlarmComparisons { LessThan, GreaterThan } [Description("Which entity is being alarmed on.")] public AlarmVariables Variable { get; set; } [Description("Method of comparing the entity to the setpoint.")] public AlarmComparisons Comparator { get; set; } [Description("Value at which to alarm.")] public Double Setpoint { get; set; } } public String Name { get; set; } public Boolean Enabled { get; set; } public String Parameter { get; set; } public List AlarmSettings { get; set; } public System.Drawing.Color RowColor { get; set; } } 

我建议远离任何类型的配置文件,而是使用某种类型的本地数据库,如sqlite或sql server express,它对应用程序崩溃更具弹性。

恕我直言,配置设置不应该是用户设置的默认容器。 对我来说,配置文件是为了确保应用程序在给定环境中运行。 例如,定义连接字符串或轮询率或具有该性质的事物。

用户设置,尤其是经常更改的用户设置,需要更好的存储机制,例如本地数据库。 当然,除非它是客户端/服务器应用程序。 在这种情况下,这些设置应该在服务器本身,并且只有在应用程序必须在断开状态下工作时才在本地持久化。

您给出的示例之一是配置似乎是一个或多个警报的示例,它是属于数据库表的某些内容的完美示例。

多年来,我一直在使用XML序列化,类似于您所描述的,在许多不同的项目中。 除非你想咬掉SQL配置,否则这似乎是最好的解决方案。

恕我直言,app.config机制并不比直接XML序列化更好。 从许多不同的项目访问此配置实际上更加困难。 如果您只是从WinForms应用程序保存瞬态(用户选项等),那么应用程序设置可以方便简单的数据类型。

在我看来,你有另一个导致腐败的问题。 我很少使用这些XML文件来破坏文件。 每当我这样做时,它与序列化期间抛出的exception有关,而不是由于应用程序崩溃等。如果要仔细检查这一点,您可能希望序列化到内存流,然后将内存流转储到磁盘。 实际上,您可以在将文件转储到磁盘之前对流进行序列化,反序列化以确保它有效。

除非您正在编写此文件,否则我会怀疑文件损坏是由于断电造成的。

除非您可以追踪错误的来源,否则您只是猜测它与Xml文件有关。 完全有可能内置的XmlSerializer失败了……例如,你可能在某个地方有一个循环引用,但除非你知道你的错误是什么,否则很难评论。

有时使用内置的Xml Serializer不是最佳选择,当对象变得复杂时,最好自己执行序列化和反序列化。 您将拥有更多控制权,并能够更准确地确定/从错误的文件数据中恢复。

 XDocument doc = new XDocument( new XElement("attachments", new XElement("directory", attachmentDirectory), new XElement("attachment-list", from attached in attachedFiles select new XElement("file", new XAttribute("name", attached.FileName), new XAttribute("size", attached.FileSize)) ) ) ); 

除此之外,配置文件用于配置,而不是程序数据。 不同之处在于配置数据不应经常更改,并且通常不能直接从用户编辑。 在winforms应用程序中,您不在配置文件中的用户之间共享数据。 如果这样做,那么您应该考虑您的应用程序是否真的是一个数据库应用程序。

自从我们在2007年决定退出Microsoft配置系统以来,我们并没有后悔一秒钟。

看看这个: http : //blog.aumcode.com/2013/08/aum-configuration-as-facilitated-by-nfx.html