2011-09-14 6 views
0

私は次のオブジェクトを持っています。int、stringなどのスタンドアジェクトオブジェクトを指定するとうまく動作し、カスタムオブジェクトではうまく動作しません。WCFのカスタムオブジェクト

[DataContract(Namespace = "")] 
public class StatusLog<TItem> 
{ 
    /// <summary> 
    /// Gets or sets the key. 
    /// </summary> 
    /// <value> 
    /// The key. 
    /// </value> 
    [DataMember] 
    public Guid Id { get; set; } 

    /// <summary> 
    /// Gets or sets the action status. 
    /// </summary> 
    /// <value> 
    /// The action status. 
    /// </value> 
    [DataMember] 
    public ActionStatus ActionStatus { get; set; } 

    /// <summary> 
    /// Gets or sets the object. 
    /// </summary> 
    /// <value> 
    /// The object. 
    /// </value> 
    [DataMember] 
    public TItem Object { get; set; } 

    /// <summary> 
    /// Gets or sets the message. 
    /// </summary> 
    /// <value> 
    /// The message. 
    /// </value> 
    [DataMember] 
    public string Message { get; set; } 
} 

これは動作します。新しいStatusLog戻り {ID = Guid.NewGuid()、ActionStatus = ActionStatus.Deleted、オブジェクト= Convert.ToInt32(ID)を、メッセージ= "ノードが正常に削除"}。

これは機能しません: 新しいStatusLog {Id = Guid.NewGuid()、ActionStatus = ActionStatus.Created、Object = MyCustomObject};

+1

MyCustomObjectの型もシリアル化属性( '[DataContract]'、 '[DataMember]')でマークされていますか? –

+0

はい、そうです。彼らは両方です。 –

答えて

3

KnownType属性を見てください。

+2

+1。 'TItem'が直列化し直す必要のあるものに対して' [KnownType(typeof(...))]属性を追加する必要があります。 – CodingWithSpike

+0

問題が見つかりました。コンテンツタイプを指定しませんでした:text/xml –

1

上記のflosk8と同様に、DataContractSerializerは、KnownType属性で修飾されていない限り、DataContractを逆シリアル化するときに考慮する型を認識しません。

http://msdn.microsoft.com/en-us/library/ms730167.aspx

あなたのDataContractに次の属性を追加してみてください:

[DataContract(Namespace = "")] 
[KnownType(typeof(MyCustomObject))] 
public class StatusLog<TItem> 
{ 
    // ... snip ... 
} 

あなたはStatusLog.Objectプロパティに、デシリアライズする必要があり、各タイプのために、この属性を追加する必要があります。さらに、これらの型はそれぞれ直列化可能である必要があります。

関連する問題