【发布时间】:2016-10-16 18:11:12
【问题描述】:
我知道 ShouldSerialize* 模式和 *Specified 模式以及它们是如何工作的,但是两者之间有什么区别吗?
当某些事情应该有条件地序列化时,是否存在使用一种方法与另一种方法的“陷阱”?
这个问题专门针对XmlSerializer 的用法,但也欢迎提供有关此主题的一般信息。
关于这个主题的信息很少,所以这可能是因为它们执行完全相同的目的并且这是一种风格选择。然而,.NET 实现者会通过反射分析类并寻找其中一种/两种模式来确定生成的序列化程序的行为似乎很奇怪,因为它减慢了序列化程序的生成速度,除非它只是一个向后兼容的工件。
编辑:对于不熟悉这两种模式的人,如果 *Specified 属性或 ShouldSerialize* 方法返回 true,则该属性将被序列化。
public string MyProperty { get; set; }
//*Specified Pattern
[XmlIgnore]
public bool MyPropertySpecified { get{ return !string.IsNullOrWhiteSpace(this.MyProperty); } }
//ShouldSerialize* Pattern
public bool ShouldSerializeMyProperty()
{
return !string.IsNullOrWhiteSpace(this.MyProperty);
}
【问题讨论】:
-
什么是“*指定模式”?你的意思是
[XmlIgnore]属性吗? -
@Sinatr 否。如果您创建一个名为
Specified 的可获取布尔属性,如果它应该被序列化,则返回 true,它似乎与 ShouldSerialize* 模式做同样的事情(显然你放了一个 @此属性的 987654327@ 属性。) -
这是故意未记录的,他们希望您改用属性。由于 Winforms 设计器的早期版本或迁移到与 XAML 等效的东西的未完成计划,此“功能”可能会潜入 XmlSerializer。这是一个猜测。
-
@HansPassant 很有趣。 *Specified 模式在
XmlSerializer类文档的备注的控制生成的 XML 部分中简要提到了here,但在 ShouldSerialize*() 模式中没有任何内容。不幸的是,当序列化是有条件的时,属性不起作用。
标签: c# .net serialization xml-serialization xmlserializer