22

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で文字列列挙型を取得する唯一の方法のようです。

4

3 に答える 3

8

これはばかげた質問かもしれません。

するとどうなりますか

[DataMember( Name = "foo" )]
private string foo { get; private set; }

public Foo Foo 
{ 
  get 
  {
    return Foo.Parse(foo);
  }
}

于 2010-01-27T21:46:54.723 に答える
1

これは古い投稿だと思いますが、言及する価値があると思います。

json文字列の逆シリアル化が失敗し、間違ったタイプに逆シリアル化されているように見えるという同様のエラーを受け取りました。

私の修正は、サーバーに送信する前にjson文字列をURLエンコードすることでした。簡単ですが簡単な間違いです。

HttpUtility.UrlEncode(JSONInstruction) /*remember to encode the string*/
于 2011-07-01T07:54:26.807 に答える
0

えーと。列挙型は整数ではありませんか?例外は有効です。これが役立つかどうかはわかりません:http://msdn.microsoft.com/en-us/library/aa347875.aspx

于 2010-01-23T01:36:02.973 に答える