为什么DataMemberAttribute需要对布尔属性进行特殊处理

时间:2013-09-24 23:53:51

标签: c# wcf serialization

我注意到,如果数据协定中的布尔属性没有发出默认属性,例如

    [DataMember(Order = 0, IsRequired = true, EmitDefaultValue = false)]
    public bool IsSet { get; set; }

然后将该属性设置为false会导致序列化错误。这似乎是违反直觉的,因为属性已经设置,只是它被设置为false。解决方案是始终配置布尔属性以发出默认值,然后true将在线路上显示为true,将false视为false。

好奇:这是System.Runtime.Serialization中的一个错误还是布尔类型语义的必然结果?

2 个答案:

答案 0 :(得分:2)

你的问题有点令人困惑,但我认为你看到的行为似乎不是一个错误,或与布尔有关。

操作合同标有IsRequired设置为true。默认情况下,EmitDefaultValue设置为true,但在发布的代码中,它已设置为false。

如果值是默认值,则EmitDefaultValue属性指示是否序列化值(换句话说,如果属性设置为false,则不会根据当前值对该属性进行序列化定义)。

由于该属性已标记为必需,如果您将值设置为false,则序列化将失败(如果EmitDefaultValue为false),因为您给出了相反的指示 - 您说的是此属性序列化是必需的,但如果它是默认值(false),则不要序列化它。

在某种程度上,我猜你可以说这是因为布尔的本质(它是真或假,而假是聋),但实际上这是因为IsRequired和{{1}的方式互动。

查看Data Member DefaultValues,特别是“与IsRequired的互动”部分。

答案 1 :(得分:0)

为避免冲突,可以使用可为null的布尔值(bool?),因此,如果将该值显式设置为false,它将按预期进行序列化。当然,请确保系统可以处理可空布尔数据类型。

    [DataMember(Order = 0, IsRequired = true, EmitDefaultValue = false)]
    public bool? IsSet { get; set; }