我注意到,如果数据协定中的布尔属性没有发出默认属性,例如
[DataMember(Order = 0, IsRequired = true, EmitDefaultValue = false)]
public bool IsSet { get; set; }
然后将该属性设置为false会导致序列化错误。这似乎是违反直觉的,因为属性已经设置,只是它被设置为false。解决方案是始终配置布尔属性以发出默认值,然后true将在线路上显示为true,将false视为false。
好奇:这是System.Runtime.Serialization中的一个错误还是布尔类型语义的必然结果?
答案 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; }