【问题标题】:Adding a new field to a class to be serialized向要序列化的类添加新字段
【发布时间】:2016-02-26 18:59:19
【问题描述】:

为了能够序列化和反序列化我这样设计的 XML:

<?xml version="1.0" encoding="utf-8"?>
<DbConnections xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <DbConnectionInfo>
    <ServerName>SQLServer2k8</ServerName>
  </DbConnectionInfo>
  <DbConnectionInfo>
    <ServerName>SQLServer2k8R2</ServerName>
  </DbConnectionInfo>
</DbConnections>

我在下面写了两个这样的类:

public class DbConnectionInfo
{
    public string ServerName { get; set; }
}

[Serializable]
[XmlRoot("DbConnections")]
public class DbConnections: List<DbConnectionInfo>
{
  //...
}

现在我想扩展我的 XML 表单并添加一个像这样的字段,但是有没有一种方法可以设计我的类,而我不必在每个 XML 标记中重复它?像这样:

<?xml version="1.0" encoding="utf-8"?>
<DbConnections xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <DbConnectionInfo>
    <ServerName>SQLServer2k8</ServerName>
  </DbConnectionInfo>
  <DbConnectionInfo>
    <ServerName>SQLServer2k8R2</ServerName>
  </DbConnectionInfo>

   <UseWindowsAuthentication>Yes</UseWindowsAuthentication>
</DbConnections>

所以我只是在之前的 XML 中添加了这一行: 但我的问题是我应该如何修改我的类来添加它?它甚至是可能的还是正确的设计?

<UseWindowsAuthentication>Yes</UseWindowsAuthentication>

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    可能是这样的

    [Serializable]
    [XmlRoot("DbConnections")]
    public class DbConnections
    {
       List<DbConnectionInfo> DbConnectionInfos;
       Boolean UseWindowsAuthentication;
    }
    

    编辑添加:如果你不想要嵌套元素,那么装饰你的类

    public class DbConnections
    {
        [XmlElement("DbConnectionInfo")]
        public List<DbConnectionInfo> DbConnectionInfos;
        public Boolean UseWindowsAuthentication;
    }
    

    我对此进行了测试,并序列化了以下 xml

    XmlSerializer serializer = new XmlSerializer(typeof(DbConnections));
                string xml;
                using (StringWriter textWriter = new StringWriter())
                {
                    serializer.Serialize(textWriter, oDbConnections);
                    xml = textWriter.ToString();
                }
    
    <?xml version="1.0" encoding="utf-16"?>
    <DbConnections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <DbConnectionInfo>
        <ServerName>test</ServerName>
      </DbConnectionInfo>
      <DbConnectionInfo>
        <ServerName>test 2</ServerName>
      </DbConnectionInfo>
      <UseWindowsAuthentication>true</UseWindowsAuthentication>
    </DbConnections>
    

    Here is a link to more info on decorating for xml serialization

    【讨论】:

    • 那么我的 XML 标记名称将是 DbConnectionInfos?
    • 这取决于你使用什么来序列化以及你如何装饰类。你可以按照上面的描述使这个结构序列化。
    • 最后一个问题:列表不会是 public List DbConnectionInfos;如果我们不使用“new”初始化它会崩溃吗?我现在就按照你的方式开始测试
    • 嗯,是的,看起来它没有崩溃~
    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多