3

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

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

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

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

4

2 回答 2

3

你的问题有点令人困惑,但我认为你似乎正在看到的行为不是错误,也不是与布尔值有关的任何事情。

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

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

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

在某种程度上我猜你可以说这是因为布尔值的性质(它要么是真要么是假,而假是默认值),但实际上它是因为方式IsRequiredEmitDefaultValue交互。

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

于 2013-09-25T03:18:04.210 回答
0

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

    [DataMember(Order = 0, IsRequired = true, EmitDefaultValue = false)]
    public bool? IsSet { get; set; }
于 2020-01-25T22:10:42.193 回答