WCFを使用してRESTfulWebサービスを利用しようとしています。Webサービスの形式を制御できないため、あちこちでいくつかの回避策を講じる必要があります。ただし、回避できないと思われる大きな問題の1つは、WCFで列挙型を文字列として逆シリアル化する方法です。
これは私のコードです(明らかに名前が変更されています):
[DataContract]
public enum Foo
{
[EnumMember( Value = "bar" )]
Bar,
[EnumMember( Value = "baz" )]
Baz
}
[DataContract]
public class UNameIt
{
[DataMember( Name = "id" )]
public long Id { get; private set; }
[DataMember( Name = "name" )]
public string Name { get; private set; }
[DataMember( Name = "foo" )]
public Foo Foo { get; private set; }
}
そして、これは逆シリアル化に失敗した返されるデータです:
{
"id":123456,
"name":"John Doe",
"foo":"bar"
}
最後に、スローされた例外:
タイプService.Fooのオブジェクトの逆シリアル化中にエラーが発生しました。値「bar」は、タイプ「Int64」として解析できません。
XmlSerializerの使用に切り替えたくありません。他の多くの欠点の中でも、プロパティにプライベートセッターを設定できないためです。
WCF(またはDataContractSerializer)に列挙型を文字列値として処理させるにはどうすればよいですか?
編集:これを行うことは不可能のようであり、動作は設計によるものです。私たちに選択肢を与えず、ハックに頼らなければならなかったマイクロソフトに感謝します。somoriが提案する方法でそれを行うことが、JSONとWCFで文字列列挙型を取得する唯一の方法のようです。