在 WCF 序列化中隐藏空字符串属性





5.00/5 (1投票)
我们强制隐藏空字符串属性,通过使用 EmitDefaultValue 进行序列化
引言
在本技巧中,我将向您展示一个技巧,如何隐藏序列化 XML 中一个 string
类型属性,如果它是空的。空但不是 null
!
背景
通常,如果您在 string
属性上使用 EmitDefaultValue = false
,DataContractSerializer
将忽略该属性,如果它具有其默认值。String
的默认值是 null
。一个空的 string
将被序列化为例如 <Title></Title>
。
如果您这些空属性被简单地忽略,您可以节省大量的字符。如果您的应用程序中,string
属性为 null
或为空没有特殊含义,您可以使用此技巧隐藏空的 string
值。
Using the Code
所以我们创建一个 private
属性,它将仅用于传输。
/// <summary>
/// This property will be used only for transfer
/// </summary>
[DataMember(EmitDefaultValue = false, Name = "Title")]
private string TitleTransfer { get; set; }
它是 private
的,但对于 DataContractSerializer
来说,这没有问题。
原始属性将用 IgnoreDataMember
进行装饰,因此它将不 被传输。
/// <summary>
/// Title of the person.
/// It can be empty.
/// </summary>
[IgnoreDataMember]
public string Title
{
get { return this.TitleTransfer ?? string.Empty; }
set
{
this.TitleTransfer = String.IsNullOrEmpty(value) ? null : value;
}
}
在原始属性的 setter 中,如果值为空,我将传输属性设置为 null
。因此,传输属性永远不会为空,而是 null
。
测试它
var p1 = new Person() { Title = "Prof.", ForeName = "Albert", LastName = "Einstein" };
因此,带有 Title
的 Person
将像往常一样被序列化。
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
<ForeName>Albert</ForeName>
<LastName>Einstein</LastName>
<Title>Prof.</Title>
</Person>
但是,没有 Title
(empty
) 的 Person
...
var p2 = new Person() { Title = string.Empty, ForeName = "Laszlo", LastName = "Vörös" };
...将被序列化为
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
<ForeName>Laszlo</ForeName>
<LastName>Vörös</LastName>
</Person>
感谢阅读!