使用序列化从XML文件读入C#类

我有以下XML文件,我试图使用DE序列化读入c#中的类:

   InfoRequest CInfoReq   theId TheID   theName NewName     

以下是我正在使用的代码,虽然它没有错误地执行,但没有数据被读入类PropertiesMapping,我在哪里错了?

 PropertiesMapping pm = null; try { System.IO.StreamReader str = new System.IO.StreamReader(@"PropertyMapping.xml"); System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(PropertiesMapping)); pm = (PropertiesMapping)xSerializer.Deserialize(str); str.Close(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "")] [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] public class PropertiesMapping { private string m_WEB_Class = ""; private string m_COM_Class = ""; private List m_EachProperty = null; public string WEB_Class { get { return m_WEB_Class; } set { m_WEB_Class = value; } } public string COM_Class { get { return m_COM_Class; } set { m_COM_Class = value; } } public IndividualProperties GetIndividualProperties(int iIndex) { return m_EachProperty[iIndex]; } public void SetIndividualProperties(IndividualProperties theProp) { m_EachProperty.Add(theProp); } } public class IndividualProperties { private string m_WEB_PropertyField; private string m_COM_PropertyField; public string WEB_Property { get { return this.m_WEB_PropertyField; } set { this.m_WEB_PropertyField = value; } } public string COM_Property { get { return this.m_COM_PropertyField; } set { this.m_COM_PropertyField = value; } } } 

您可以使用XmlElementAttribute来简化C#命名。

指示当XmlSerializer序列化或反序列化包含它的对象时,公共字段或属性表示XML元素。

您需要将XmlArrayItemAttribute用于Mappings元素。

表示一个属性,指定XmlSerializer可以放置在序列化数组中的派生类型。

类别:

 [XmlType("PropertiesMapping")] public class PropertyMapping { public PropertyMapping() { Properties = new List(); } [XmlElement("Property")] public List Properties { get; set; } } public class Property { public Property() { Mappings = new List(); } [XmlElement("WEB_Class")] public string WebClass { get; set; } [XmlElement("COM_Class")] public string ComClass { get; set; } [XmlArray("Mappings")] [XmlArrayItem("Map")] public List Mappings { get; set; } } [XmlType("Map")] public class Mapping { [XmlElement("WEB_Property")] public string WebProperty { get; set; } [XmlElement("COM_Property")] public string ComProperty { get; set; } } 

演示:

 PropertyMapping result; var serializer = new XmlSerializer(typeof(PropertyMapping)); using(var stream = new StringReader(data)) using(var reader = XmlReader.Create(stream)) { result = (PropertyMapping) serializer.Deserialize(reader); } 

您不需要显式声明属性。 只需确保名称匹配。 唯一的非默认部分是[XmlArrayItem("Map")]属性,您需要使用地图数组的不同名称。

但是,您可以通过指定XmlElementAttribute来使用与COM_PropertyWEB_Property不同的名称。

 class Program { static void Main(string[] args) { string testData = @"   InfoRequest CInfoReq   theId TheID   theName NewName    "; var sr = new System.IO.StringReader(testData); var xs = new XmlSerializer(typeof(PropertiesMapping)); object result = xs.Deserialize(sr); } } [Serializable] public class PropertiesMapping { public Property Property { get; set; } } [Serializable] public class Property { [XmlElement("WEB_Class")] public string WebClass { get; set; } [XmlElement("COM_Class")] public string ComClass { get; set; } [XmlArrayItem("Map")] public Mapping[] Mappings { get; set; } } [Serializable] public class Mapping { [XmlElement("WEB_Property")] public string WebProperty { get; set; } [XmlElement("COM_Property")] public string ComProperty { get; set; } } 

根据您尝试实现的目标,使用XDocument和Linq-to-XML可以更轻松地完成。

就序列化而言,这里有一个类结构:

 public class PropertiesMapping{ [XmleElement] public string WEB_Class {get;set;} [XmleElement] public string COM_Class{get;set;} [XmlArray("Mappings")] public Map[] Mappings {get;set;} } public class Map{ [XmleElement] public string WEB_Property{get;set;} [XmleElement] public string COM_Property{get;set;} }