2010-01-08 117 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