【问题标题】:partial xml serialization/deserialization部分xml序列化/反序列化
【发布时间】:2010-01-08 21:44:18
【问题描述】:

是否可以将对象部分(反)/序列化为字符串?

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

所以最终,我们希望下面的字符串能够工作......

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

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

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

反之亦然,当此特定 Foo 实例被序列化时将生成上述 xml。

可能吗?

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

    我希望[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 get 函数以使用垃圾“根”元素填充加载的 xml。也许 doc.LoadXml('' + xml + '');并更改 setter 函数以返回 value.InnerXml;这样您就可以拥有不包含在根元素中的 xml。
    猜你喜欢
    • 2011-01-04
    • 2011-05-12
    • 2011-05-03
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多