当前位置:  开发笔记 > 编程语言 > 正文

无法使ShouldSerialize模式与XmlSerializer一起使用

如何解决《无法使ShouldSerialize模式与XmlSerializer一起使用》经验,为你挑选了1个好方法。



1> Amy..:

这是检查发生的地方:http: //referencesource.microsoft.com/#System.Xml/System/Xml/Serialization/Models.cs,249.

正如您所看到的,ShouldSerialize*在它已经识别出要序列化的字段/属性之后,它才会调用该方法.所以,你ListOfTestClassB必须是可序列化的,或者必须用它来装饰[XmlIgnore].为了可序列化,您的属性必须是具有[Serializable]应用属性的具体类型.

如果您无法修改该类,则有一种解决方法.该XmlSerializer.Serialize(...)方法的一个重载接受覆盖对象.我在下面创建了一个简单的例子:

[Serializable]
public class Foo
{
    public IList Numbers { get; set; }
    public string TheNumber { get; set; }
}

class Program
{
    private static void Main(string[] args)
    {
        var attributes = new XmlAttributes
        {
            XmlIgnore = true
        };
        var overrides = new XmlAttributeOverrides();
        overrides.Add(typeof(Foo), "Numbers", attributes);

        var serializer = new XmlSerializer(typeof(Foo), overrides);

        // the rest of this is for demo purposes.  
        // the code above is whats important
        //
        using (var ms = new MemoryStream())
        using (var reader = new StreamReader(ms))
        {
            serializer.Serialize(ms, new Foo() { TheNumber = "5" });    
            ms.Flush();
            ms.Seek(0, SeekOrigin.Begin);
            Debug.WriteLine(reader.ReadToEnd());
        }

    }

}

这会产生:



  5

如您所见,我正在动态地将XmlIgnore属性添加到我的Numbers元素中,然后序列化程序忽略它.:)你应该没有麻烦适应你自己的代码.

注意:正如dbc所述,缓存此序列化程序并重新使用它很重要,否则您将会遇到大量内存泄漏.您可以保留对它的静态引用,或使用哈希表为不同类型存储不同的序列化程序.

为了提高性能,XML序列化基础结构动态生成程序集以序列化和反序列化指定的类型.基础结构查找并重用这些程序集.仅当使用以下构造函数时,才会出现此问题:

XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)

如果使用任何其他构造函数,则会生成同一程序集的多个版本,并且永远不会卸载,这会导致内存泄漏和性能下降.最简单的解决方案是使用前面提到的两个构造函数之一.否则,必须将程序集缓存在Hashtable中,如以下示例所示.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有