部分xml序列化/反序列化
问题描述:
是否可以部分(反)/序列化一个对象从/到一个字符串?部分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。
可能吗?
答
我希望[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);
}
}
好的答案。我有一个修改,我认为它会变得更好.. 更改XmlJunkAsStringSerialized获取函数来为加载的xml填充垃圾“根”元素。也许doc.LoadXml(''+ xml +' XmlJunkAsStringSerializedRoot>'); 并改变setter函数返回value.InnerXml; 这样你就可以拥有不包含在根元素中的xml。 –
2010-01-11 17:31:22