2010-01-08 164 views
2

是否可以部分(反)/序列化一个对象从/到一个字符串?部分xml序列化/反序列化

class Foo 
{ 
     Bar Bar{get;set;} 
     string XmlJunkAsString{get;set;} 
} 

所以ultmately,我们希望下面的字符串工作...

<Foo><Bar></Bar><XmlJunkAsString><xml><that/><will/><not/><be/><parsed/></xml></XmlJunkAsString></Foo> 

,最终我们可以找到Foo.XmlJunkAsString的内容包含字符串

<xml><that/><will/><not/><be/><parsed/></xml> 

反之亦然,当Foo的这个特定实例被序列化时,将会产生上面的xml。

可能吗?

回答

2

我希望[XmlText]可以工作,但它似乎逃脱了;你可以实现IXmlSerializable,但这非常棘手。以下是丑陋的,但给出了正确的结果(虽然你可能会得到一些XML空白区别)

using System; 
using System.ComponentModel; 
using System.Xml; 
using System.Xml.Serialization; 
public class Bar { } 
public class Foo 
{ 
    public Bar Bar { get; set; } 

    [XmlIgnore] 
    public string XmlJunkAsString { get; set; } 

    [XmlElement("XmlJunkAsString"), Browsable(false)] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    public XmlElement XmlJunkAsStringSerialized 
    { 
     get 
     { 
      string xml = XmlJunkAsString; 
      if (string.IsNullOrEmpty(xml)) return null; 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(xml); 
      return doc.DocumentElement; 
     } 
     set 
     { 
      XmlJunkAsString = value == null ? null : value.OuterXml; 
     } 
    } 
} 
static class Program { 
    static void Main() 
    { 
     var obj = new Foo 
     { 
      Bar = new Bar(), 
      XmlJunkAsString = "<xml><that/><will/><not/><be/><parsed/></xml>" 
     }; 
     var ser = new XmlSerializer(obj.GetType()); 
     ser.Serialize(Console.Out, obj); 
    } 
} 
+0

好的答案。我有一个修改,我认为它会变得更好.. 更改XmlJunkAsStringSerialized获取函数来为加载的xml填充垃圾“根”元素。也许doc.LoadXml(''+ xml +''); 并改变setter函数返回value.InnerXml; 这样你就可以拥有不包含在根元素中的xml。 – 2010-01-11 17:31:22