将XML部分反序列化为Object

我有一些XML,我将其反序列化为业务对象。 我正在使用XmlSerializer.Deserialize来执行此操作。 但是,我希望XML中包含的一个XmlElement保留一个XElement。

它不能直接完成(使用XmlElementAttribute),因为XElement不是Serializable。 我还试图将该元素序列化为一个字符串(两步尝试获取一个XElement),但失败并出现错误:

意外的节点类型元素。 readelementstring方法只能在具有简单或空内容的元素上调用

知道如何做到这一点?

这是一个xml的例子和我想要的结果对象:

      ...   

宾语:

  public class Person { [XmlAttribute("Name")] public string Name {get; set;} ????? public XElement Hobbies {get; set;} [XmlElement("HomeAddress")] public Address HomeAddress {get; set;} } 

尝试不起作用:

 [XmlElement("Hobbies")] public XElement Hobbies {get; set;} [XmlElement("Hobbies")] public string Hobbies {get; set;} 

为了避免实现像IXmlSerializable这样的东西,你可能会做一些半隐藏的pass-thru XmlElement属性。 但是,请注意,由于您只能拥有一个根XElement值(而不是两个,根据您的示例),因此您不能完全按照自己的意愿XElement ; 你需要一个清单才能做到这一点……

 using System; using System.ComponentModel; using System.Xml; using System.Xml.Linq; using System.Xml.Serialization; public class Person { [XmlAttribute("Name")] public string Name { get; set; } [XmlIgnore] public XElement Hobbies { get; set; } [XmlElement("Hobbies")] [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public XmlElement HobbiesSerialized { get { XElement hobbies = Hobbies; if(hobbies == null) return null; XmlDocument doc = new XmlDocument(); doc.LoadXml(hobbies.ToString()); return doc.DocumentElement; } set { Hobbies = value == null ? null : XElement.Parse(value.OuterXml); } } [XmlElement("HomeAddress")] public Address HomeAddress { get; set; } } public class Address { } static class Progmam { static void Main() { var p = new Person { Hobbies = new XElement("xml", new XAttribute("hi","there")) }; var ser = new XmlSerializer(p.GetType()); ser.Serialize(Console.Out, p); } } 

要完全控制(以及完全负责)如何生成XML,您可以让您的类实现System.Xml.Serialization.IXmlSerializable接口,并覆盖ReadXml和WriteXml。 我必须在使用字典类之前执行此操作 – 确保彻底测试,尤其是使用null属性,空字段等。

http://www.devx.com/dotnet/Article/29720