65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2017 年 9 月 29 日

CPOL

1分钟阅读

viewsIcon

12217

我们强制隐藏空字符串属性,通过使用 EmitDefaultValue 进行序列化

引言

在本技巧中,我将向您展示一个技巧,如何隐藏序列化 XML 中一个 string 类型属性,如果它是空的。空但不是 null

背景

通常,如果您在 string 属性上使用 EmitDefaultValue = falseDataContractSerializer 将忽略该属性,如果它具有其默认值。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" };

因此,带有 TitlePerson 将像往常一样被序列化。

<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>

感谢阅读!

© . All rights reserved.