.net - 集合的xml序列化

标签 .net xml-serialization

我想序列化以下 Xml 结构:

  <XmlRootElement>
     <Company name="Acme Widgets LLC">
        <DbApplication name="ApplicationA" vendor="oracle">
           <ConnSpec environment="DEV" 
                     server="DBOraDev1201" 
                     database="AppA" 
                     userId="MyUser" 
                     password="5613456#6%^%$%$#" />
           <ConnSpec environment="QA" 
                     server="DBOraQA1205" 
                     database="AppA" 
                     userId="MyUser" 
                     password="5613456#6%^%$%$#" />
       </DbApplication>
       <DbApplication name="AnotherApp" "vendor="SQLServer">
           <ConnSpec environment="DEV" 
                     server="DBMsSqlDev1201" 
                     catalog="AnoptherApp" 
                     userId="MyUser" 
                     password="5613456#6%^%$%$#" />
           <ConnSpec environment="QA" 
                     server="DBMsSqlQA1565" 
                     catalog="AnotherApp" 
                     userId="MyUser" 
                     password="5613456#6%^%$%$#" />
       </DbApplication>
     </Company>
     <Company name = "ExpertSoftware Inc" ....
        ...
     </Company>
  </XmlRootElement>

但是我在link text中发现了

引用上面的链接: ...

  • 问:为什么不是所有的属性 集合类序列化了吗?
  • A:XmlSerializer 只序列化 集合中的元素 它检测 IEnumerable 或 ICollection 接口(interface)。这个 行为是设计使然。唯一的作品 around 是重构习惯 集合分为两类,其中之一 这暴露了属性 包括其中一个纯收藏 类型。

...

在发现您无法序列化或反序列化其中包含其他 Xml 属性的集合之后...建议的解决方法是将包含该集合的元素与具有其他属性的元素分开...即,您必须更改结构,使其看起来像这样:

  <XmlRootElement>
     <Companys>
        <Company name="Acme Widgets LLC">
           <DbApplications>
               <DbApplication name="ApplicationA" vendor="oracle">
                  <ConnSpecs>
                     <ConnSpec environment="DEV" 
                         server="DBOraDev1201" ...  />
                     <ConnSpec environment="QA" 
                         server="DBOraQA1205" 
                         database="AppA" ... />
                  </ConnSpecs>
               </DbApplication>
               <DbApplication name="AnotherApp" "vendor="SQLServer">
                  <ConnSpecs>
                      <ConnSpec environment="DEV" ... />
                      <ConnSpec environment="QA"  ... />
                  </ConnSpecs>
                </DbApplication>
           </DbApplications>
         </Company>
         <Company name = "ExpertSoftware Inc" ....
             ...
         </Company>
     </Companys>
  </XmlRootElement>

有谁知道为什么会这样吗?或者是否有其他方法可以做到这一点?

最佳答案

如果您使用 XmlSerializer您需要指示它如何序列化您的收藏:

public class XmlRootElement
{
    [XmlElement(ElementName="Company")]
    public Company[] Company { get; set; }

    // Other properties ....
}

public class Company
{
    [XmlAttribute(AttributeName="name")]
    public string Name { get; set; }

    [XmlElement(ElementName = "DbApplication")]
    public DbApplication[] DbApplication { get; set; }

    // Other properties ....
}

public class DbApplication
{
    [XmlElement(ElementName = "ConnSpec")]
    public ConnSpec[] ConnSpec { get; set; }

    // Other properties ....
}

public class ConnSpec
{
    // Other properties ....
}

然后:

using (Stream stream = new FileStream("test.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    XmlSerializer serializer = new XmlSerializer(typeof(XmlRootElement));
    XmlRootElement root = (XmlRootElement)serializer.Deserialize(stream);
}

希望这对您有所帮助。

关于.net - 集合的xml序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/326822/

相关文章:

c# - 测试一个类是否可以被序列化

C# 如何从数据库中填充使用 XSD.EXE 创建的类

c# - 我可以在不实现 IXmlSerializable 的情况下为 XmlSerializer 提供自定义序列化吗?

c# - VB.NET,创建一个返回类型为泛型的函数?

c# - 发送 SOAP 请求,从哪里开始?

c# - Integer 是创建在栈上还是堆上?

c# - ServiceStack:如何处理错误?

c# - 如何使 XmlSerializer 默认生成属性而不是元素

.net - 明显的 F#/BCL 浮点错误

c# - 将匿名类型组传递给函数