在.NET C中保存复杂的用户设置#

时间:2013-11-28 08:56:01

标签: c# .net application-settings

我正在编写一个小工具来连接到MS SCOM服务器并添加用于监控警报的子目录。但是,我想保存连接和订阅设置somwhere / some how。这是粗略的结构

public class ConnectionManager
{
    ...
    public BindingList<Connection> Connections // All the connection we know
    ...
}

然后我们有了联系。基本上这个类保存所需的连接字段,如服务器名称,用户域,连接到服务器,保持连接等活动等。

public class Connection
{
    ...
    public string Name;                               // the name of this connection
    public string ServerName;                         // the scom server name
    public string UserDomain;                         // the domain, NETBIOS or FQDN
    public BindingList<Subscription> Subscriptions;   // The subscriptions for this connection
    ...
}

最后,连接类具有Alert Criterias。警报标准基本上是某种正则表达式。目前只是“扩展”(只是一个字符串),但我将构建简单的表达式,它将在即时生成。它看起来像这样

public class Subscription
{
    ...
    public string ExtededExpression;                        // if not empty, use this
    public BindingList<CriteriaOperator> SimpleOperators;   // otherwhise build a regular expression from this stuff
    ...
}

与另一个子类

public class CriteriaOperator
{
    ...
    public string Field;                  // The field, g.g. LastModified
    public LogicalOperator Operator;      // The logical operator, e.g. LIKE
    public string CompareFieldTo;         // A regular expression, e.g. "%SQL%"
    ...
}

现在我的问题是:您认为保存这种结构的最佳方法是什么?我是.NET的新手,所以我不确定:使用应用程序设置?或者使用XML Serializer对此结构进行序列化/反序列化?或者写一些包装类然后使用XML Serializer?或者可能还有其他方法吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我建议不要使用ApplicationSettings 。 IMHO ApplicationsSettings用于存储和重新加载您的UI状态,例如特定用户中文本编辑器中的最后10个文件或“不再显示此消息”!

如果您正在考虑加载/保存方案,我建议创建一个类来存储保存应用程序状态所需的所有字段不要使用序列化直接存储某些逻辑类,否则会搞乱事情并降低可维护性。

通过使用一个保存项目,您可以将所有加载/存储操作集中在一个位置。

因此...

public class SaveItem
{
    // ----------------------------------------------
    // version 1.02:
    public bool New { get; set; }
    public string VeryNew { get; set; }

    // ----------------------------------------------
    // version 1.01:

    public bool Bugfix { get; set; }
    public List<string> AList { get; set; } 

    public SaveItem()
    {
        // ...
    }

    public bool TrySave(string fullFilePath)
    {
        bool result = false;
        TextWriter textWriter = new StreamWriter(fullFilePath);
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(SaveItem));
        try
        {
            xmlSerializer.Serialize(textWriter, this);
            result = true;
        }
        catch (IOException)
        {

        }
        finally
        {
            try
            {
                textWriter.Close();
            }
            catch
            { }
        }
        return result;
    }


    public static bool TryLoad(string fullFilePath, out SaveItem saveItem)
    {
        bool result = false;
        saveItem = new SaveItem();
        TextReader textReader = null;
        try
        {
            textReader = new StreamReader(fullFilePath);
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(SaveItem));
            saveItem = (SaveItem)xmlSerializer.Deserialize(textReader);
            if (saveItem != null)
            {
                result = true;
            }
        }
        catch (FileNotFoundException)
        {
            if (saveItem != null)
            {
            }
        }
        finally
        {
            if (textReader != null)
            {
                textReader.Close();
            }
        }
        return result;
    }

}

答案 1 :(得分:0)

至于我,为此你应该:

  • 在处理设置时,写一个 singleton 类(here是一篇关于它的好文章)。
  • 使用二进制或XML 序列化 - 因为它易于定制
  • 将设置保存到通用路径,我已回答where to store it