代码之家  ›  专栏  ›  技术社区  ›  drharris

用于配置的XML序列化的替代方法

  •  4
  • drharris  · 技术社区  · 15 年前

    目前,我们使用的是一个巨大的配置对象,它被序列化到XML中或从XML中序列化。这在很大程度上工作得很好,但我们发现,在断电和应用程序崩溃的情况下,文件可能处于无法正确反序列化的状态,从而有效地破坏了配置信息。

    我想使用内置的app.config,但它似乎不容易支持自定义类。例如,通过XML序列化,我可以轻松地序列化泛型 list<ComplexClass> 没有额外的代码。它只是工作。似乎在使用app.config时,您必须提供大量的信息和自定义类才能工作。另外,大多数“自定义配置”教程都是2007年左右的,据我所知可能已经过时了。有人知道在.NET4.0中最新的方法吗?

    此外,当应用程序中出现问题时,有9/10的情况是由于配置不当造成的。App.config喜欢将用户可更改的设置存储在不熟悉隐藏目录等的用户无法访问的位置。有没有办法让一个单独的位置来存储配置文件,当出现问题时用户可以很容易地通过电子邮件发送给我们?

    作为进一步的示例,这是我要序列化为的对象类型之一的精简版本 List<Alarm> Alarm s可以变化或为空。在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<AlarmSetting> AlarmSettings { get; set; }
        public System.Drawing.Color RowColor { get; set; }
    }
    
    4 回复  |  直到 15 年前
        1
  •  7
  •   ChrisLively    15 年前

    我建议不要使用任何类型的配置文件,而是使用某种类型的本地数据库,例如 sqlite 或者sql server express,它对应用程序崩溃的恢复能力更强。

    配置设置不应该是的默认容器 设置。对我来说,有一个配置文件可以确保应用程序在给定的环境中运行。例如,定义连接字符串、轮询率或类似的东西。

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

    在您给出的示例中,配置一个或多个报警是属于数据库表的某个对象的一个完美示例。

        2
  •  2
  •   Scott P    15 年前

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

    嗯,app.config机制并不比直接的XML序列化更好。实际上,从许多不同的项目访问此配置更为困难。如果只保存WinForms应用程序的瞬态(用户选项等),则应用程序设置对于简单的数据类型很方便。

    除非你在写这个文件 我怀疑文件损坏是由于断电造成的。

        3
  •  1
  •   Robert Paulson    15 年前

    除非您能找到错误的来源,否则您只能猜测它与Xml文件有关。内置XmlSerializer完全有可能出现故障。。e、 你可能在某处有一个循环引用,但除非你知道你的错误是什么,否则很难评论。

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

    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应用程序中,配置文件中的用户之间不共享数据。如果你这样做了,那么你应该考虑你的应用程序是否真的是一个数据库应用程序。

        4
  •  1
  •   itadapter DKh    12 年前

    因为我们在2007年做出了退出微软配置系统的决定 我们一刻也没有后悔。

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