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

C# 在.NET C中保存复杂的用户设置#,c#,.net,application-settings,C#,.net,Application Settings,我正在编写一个小工具,用于连接到MS SCOM服务器并添加用于监视警报的子描述。但是,我想将连接和订阅设置保存到somwhere/some How。这是大致的结构 public class ConnectionManager { ... public BindingList<Connection> Connections // All the connection we know ... } 现在我的问题是:你认为保存这样一个结构的最好方法是什么?我是.NE

我正在编写一个小工具,用于连接到MS SCOM服务器并添加用于监视警报的子描述。但是,我想将连接和订阅设置保存到somwhere/some How。这是大致的结构

public class ConnectionManager
{
    ...
    public BindingList<Connection> Connections // All the connection we know
    ...
}
现在我的问题是:你认为保存这样一个结构的最好方法是什么?我是.NET新手,所以我不确定:是否使用应用程序设置?还是使用XML序列化程序序列化/反序列化此结构?或者编写一些包装类,然后使用XML序列化程序?还是有完全不同的方法


谢谢你的帮助

至于我,为此,你应该:

  • 编写一个处理设置的singleton类(在我的博客上是一篇关于它的好文章)
  • 使用二进制或XML序列化——因为它简单且可自定义
  • 将设置保存到通用路径,我已经回答了

    • 至于我,为此,你应该:

      • 编写一个处理设置的singleton类(在我的博客上是一篇关于它的好文章)
      • 使用二进制或XML序列化——因为它简单且可自定义
      • 将设置保存到通用路径,我已经回答了

      我建议不要使用应用程序设置。IMHO应用程序设置用于存储和重新加载用户界面状态,例如,在文本编辑器中存储最近10个使用过的文件,或为特定用户“不再显示此消息”

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

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

      所以

      公共类SaveItem
      {
      // ----------------------------------------------
      //版本1.02:
      公共bool New{get;set;}
      公共字符串VeryNew{get;set;}
      // ----------------------------------------------
      //1.01版:
      公共布尔错误修复{get;set;}
      公共列表列表{get;set;}
      公共存储项()
      {
      // ...
      }
      公共bool TrySave(字符串fullFilePath)
      {
      布尔结果=假;
      TextWriter TextWriter=新的StreamWriter(完整文件路径);
      XmlSerializer XmlSerializer=新的XmlSerializer(typeof(SaveItem));
      尝试
      {
      序列化(textWriter,this);
      结果=真;
      }
      捕获(IOException)
      {
      }
      最后
      {
      尝试
      {
      textWriter.Close();
      }
      抓住
      { }
      }
      返回结果;
      }
      公共静态bool TryLoad(字符串fullFilePath,out SaveItem SaveItem)
      {
      布尔结果=假;
      saveItem=新的saveItem();
      TextReader=null;
      尝试
      {
      textReader=新的StreamReader(fullFilePath);
      XmlSerializer XmlSerializer=新的XmlSerializer(typeof(SaveItem));
      saveItem=(saveItem)xmlSerializer.Deserialize(textReader);
      if(saveItem!=null)
      {
      结果=真;
      }
      }
      捕获(FileNotFoundException)
      {
      if(saveItem!=null)
      {
      }
      }
      最后
      {
      如果(文本阅读器!=null)
      {
      textReader.Close();
      }
      }
      返回结果;
      }
      }
      
      我建议不要使用应用程序设置。IMHO应用程序设置用于存储和重新加载用户界面状态,例如,在文本编辑器中存储最近10个使用过的文件,或为特定用户“不再显示此消息”

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

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

      所以

      公共类SaveItem
      {
      // ----------------------------------------------
      //版本1.02:
      公共bool New{get;set;}
      公共字符串VeryNew{get;set;}
      // ----------------------------------------------
      //1.01版:
      公共布尔错误修复{get;set;}
      公共列表列表{get;set;}
      公共存储项()
      {
      // ...
      }
      公共bool TrySave(字符串fullFilePath)
      {
      布尔结果=假;
      TextWriter TextWriter=新的StreamWriter(完整文件路径);
      XmlSerializer XmlSerializer=新的XmlSerializer(typeof(SaveItem));
      尝试
      {
      序列化(textWriter,this);
      结果=真;
      }
      捕获(IOException)
      {
      }
      最后
      {
      尝试
      {
      textWriter.Close();
      }
      抓住
      { }
      }
      返回结果;
      }
      公共静态bool TryLoad(字符串fullFilePath,out SaveItem SaveItem)
      {
      布尔结果=假;
      saveItem=新的saveItem();
      TextReader=null;
      尝试
      {
      textReader=新的StreamReader(fullFilePath);
      XmlSerializer XmlSerializer=新的XmlSerializer(typeof(SaveItem));
      saveItem=(saveItem)xmlSerializer.Deserialize(textReader);
      if(saveItem!=null)
      {
      结果=真;
      }
      }
      捕获(FileNotFoundException)
      {
      if(saveItem!=null)
      {
      }
      }
      最后
      {
      如果(文本阅读器!=null)
      
      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
          ...
      }
      
      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%"
          ...
      }
      
      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;
          }
      
      }