【问题标题】:Why does deserializing my packages.config in c# return null values?为什么在 c# 中反序列化我的 packages.config 会返回空值?
【发布时间】:2014-09-04 22:42:18
【问题描述】:

我正在尝试在 C# 中反序列化我的 packages.config 文件,但我返回的 Collection 始终为空。如果我的 xml 文件由单个属性集合组成,是否需要一些特殊的东西?

[Serializable()]
[System.Xml.Serialization.XmlTypeAttribute()]
public class Package
{
    [System.Xml.Serialization.XmlAttribute("id")]
    public string Id {get;set;}
    [System.Xml.Serialization.XmlAttribute("version")]
    public string Version {get;set;}
}

[Serializable()]
[System.Xml.Serialization.XmlRoot("packages")]
public class PackageCollection
{
    [System.Xml.Serialization.XmlArrayItem("package", typeof(Package))]
    public Package[] Packages {get;set;}    
}


void Main()
{
    var path = "C:\D\packages.config";
    var serializer  = new System.Xml.Serialization.XmlSerializer(typeof(PackageCollection), new System.Xml.Serialization.XmlRootAttribute("packages"));
    StreamReader reader = new StreamReader(file);
    var packages2 = (PackageCollection)serializer.Deserialize(reader);
    reader.Close();
}

我的 packages.config 的样子

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
  <package id="Autofac" version="3.3.1" targetFramework="net45" /> 
  <package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" targetFramework="net45" /> 
  <package id="Microsoft.AspNet.WebApi.Core" version="4.0.20710.0" targetFramework="net45" /> 
  <package id="Microsoft.AspNet.WebApi.Tracing" version="4.0.30506" targetFramework="net45" /> 
  <package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net45" /> 
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" /> 
  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net45" /> 
</packages> 

【问题讨论】:

标签: c# xml deserialization


【解决方案1】:

在这种情况下使用 XmlElement:

[Serializable()]
[System.Xml.Serialization.XmlRoot("packages")]
public class PackageCollection
{
    [System.Xml.Serialization.XmlElement("package", typeof(Package))]
    public Package[] Packages { get; set; }
}

【讨论】:

    【解决方案2】:

    根据包含的测试,此代码似乎可以根据您的需要运行:

    [Serializable()]
    [System.Xml.Serialization.XmlTypeAttribute()]
    public class Package
    {
        [System.Xml.Serialization.XmlAttributeAttribute("id")]
        public string Id { get; set; }
    
        [System.Xml.Serialization.XmlAttributeAttribute("version")]
        public string Version { get; set; }
    
        [System.Xml.Serialization.XmlAttributeAttribute("targetFramework")]
        public string TargetFramework { get; set; }
    }
    
    [Serializable()]
    [System.Xml.Serialization.XmlRoot("packages")]
    public class PackageCollection
    {
        [System.Xml.Serialization.XmlElementAttribute("package")]
        public Package[] Packages { get; set; }
    }
    
    class Program
    {
        static void Main()
        {
            var path = @"C:\packages.config";
            var serializer = new System.Xml.Serialization.XmlSerializer(typeof(PackageCollection));
            StreamReader reader = new StreamReader(path);
            var packages2 = (PackageCollection)serializer.Deserialize(reader);
            foreach (Package pkg in packages2.Packages)
            {
                Console.WriteLine("ID: " + pkg.Id);
                Console.WriteLine("Version: " + pkg.Version);
                Console.WriteLine("Target Framework: " + pkg.TargetFramework);
                Console.WriteLine();              
            }     
            reader.Close();
            Console.ReadLine();
        }
    }
    

    正如@Isantipov 所说,XML Schema Definition Tool (Xsd.exe)- MDSN 可以提供帮助。

    另请参阅问题How to Deserialize XML document 了解更多信息,特别是Marc Gravell's answer

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 2019-07-11
      • 2011-05-14
      相关资源
      最近更新 更多