2016-11-10 9 views
0

私はパラメータでPropertyValueをを取る方法UpdatePropertyで、WCFサービスがあります。KeyValuePair

void UpdateProperty(PropertyValue propertyValue) 

[DataContract] 
public class PropertyValue 
{ 
    [DataMember] 
    public string Property { get; private set; } 

    [DataMember] 
    public object Value { get; private set; } 
} 

私は値としてKeyValuePairでメソッドを呼び出ししようとしている、と私は取得していますこのエラー: メッセージをデシリアライズしようとしているときに

」フォーマッタが例外をスローしました:パラメータ http://tempuri.org/:propertyValueをデシリアライズしようとしているときにエラーが発生しましたのInnerExceptionメッセージがライン1に 「エラーでした。要素 'http://schemas.datacontract.org/2004/07/MyProject.DataContracts:Value' には、 'http://schemas.datacontract.org/2004/07/System.Collections.Generic:KeyValuePairOfanyTypeanyType'という名前にマップされた型のデータが含まれています。 デシリアライザには、この名前にマップされているタイプの知識はありません。あなたが DataContractSerializerを使用している場合は DataContractResolverの使用を検討してか、知られているタイプのリストに に「KeyValuePairOfanyTypeanyType」対応するタイプを追加 - KnownTypeAttribute属性を使用するか にに渡された既知の型のリストを追加することによって、 例えばシリアライザ。 ' 。詳細については のInnerExceptionを参照してください」

を私は私のクラスにKnownTypeを追加しようとしましたが、私はまだエラーを取得:

[KnownType(typeof(KeyValuePair<object, object>))] 

私は他に他のKeyValuePairを使用している理由を任意のアイデアを?問題のない方法(パラメータとして)...私のSOAPボディに

、私が持っている:

<d4p1:Value xmlns:d7p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" i:type="d7p1:KeyValuePairOfanyTypeanyType"> 
     <d7p1:key>test</d7p1:key> 
     <d7p1:value>test</d7p1:value> 
    </d4p1:Value> 
+0

ワイヤでシリアル化する 'KeyValuePair <,>'の実際のタイプは何ですか?それは本当に 'KeyValuePair 'ですか、それは 'KeyValuePair 'ですか? – dbc

+0

私は両方を試しましたが、実際に私のユースケースに必要なのは、KeyValuePair です。 – user3544117

+0

プロパティ 'Value'で使用している型がわからないようです。あなたのクラス 'PropertyValue'を' [KnownType(type)(MyType)] 'でマークします。' MyType'はあなたが 'Value'プロパティで彼に与えるタイプです。 – Rabban

答えて

0

I私はあなたが欲しいものを知っていると思います。あなたの入力としてこのオブジェクトを試してください:

[Serializable] 
public class WebServiceInputGetDataParams : ISerializable 
{ 
    public Dictionary<string, object> Entries 
    { 
     get { return entries; } 
    } 


    private Dictionary<string, object> entries; 
    public WebServiceInputGetDataParams() 
    { 
     entries = new Dictionary<string, object>(); 
    } 
    protected WebServiceInputGetDataParams(SerializationInfo info, StreamingContext context) 
    { 
     entries = new Dictionary<string, object>(); 
     foreach (var entry in info) 
     { 
      entries.Add(entry.Name, entry.Value); 
     } 
    } 
    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     foreach (var entry in entries) 
     { 
      info.AddValue(entry.Key, entry.Value); 
     } 
    } 
} 
関連する問題