这是检查发生的地方:http: //referencesource.microsoft.com/#System.Xml/System/Xml/Serialization/Models.cs,249.
正如您所看到的,ShouldSerialize*
在它已经识别出要序列化的字段/属性之后,它才会调用该方法.所以,你ListOfTestClassB
必须是可序列化的,或者必须用它来装饰[XmlIgnore]
.为了可序列化,您的属性必须是具有[Serializable]
应用属性的具体类型.
如果您无法修改该类,则有一种解决方法.该XmlSerializer.Serialize(...)
方法的一个重载接受覆盖对象.我在下面创建了一个简单的例子:
[Serializable] public class Foo { public IListNumbers { 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中,如以下示例所示.