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

あなたの質問は少し紛らわしいですが、あなたが見ているように見える動作はバグではなく、ブール値とは関係ないと思います。

操作コントラクトはIsRequiredtrue に設定されています。デフォルトでEmitDefaultValueは true に設定されていますが、投稿されたコードでは false に設定されています。

このEmitDefaultValue属性は、値がデフォルト値である場合に値をシリアル化するかどうかを示します (つまり、プロパティが に設定されている場合、false現在の定義に従ってそのプロパティはシリアル化されません)。

falseプロパティは必須としてマークされているため、シリアル化に値を設定すると ( EmitDefaultValuefalse の場合) 矛盾する指示を与えているため失敗します - このプロパティはシリアル化に必要であると言っていますが、それがデフォルト (false)。

ある意味では、ブール値の性質によるものだと言えると思いますが (true または false のいずれかであり、false がデフォルトです)、実際には方法IsRequiredEmitDefaultValue相互作用によるものです。

Data Member DefaultValues、特に「IsRequired との相互作用」セクションを見てください。

于 2013-09-25T03:18:04.210 に答える