2011-09-14 53 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),消息= 「節點成功刪除」};

這是行不通的: new StatusLog {Id = Guid.NewGuid(),ActionStatus = ActionStatus.Created,Object = MyCustomObject};

+1

MyCustomObject的類型是否也用序列化屬性標記('[DataContract]','[DataMember]')? –

+0

是的。他們都是。 –

回答

3

查看KnownType屬性。

+2

+1。您需要爲'TItem'可能需要序列化的任何內容添加'[KnownType(typeof(...))]'屬性。 – CodingWithSpike

+0

好的發現問題,我沒有指定Content-Type:text/xml –

1

正如flosk8所提到的那樣,DataContractSerializer在反序列化DataContract時將不會知道需要考慮哪些類型,除非它使用KnownType屬性進行裝飾。

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

嘗試添加以下屬性到你的DataContract:

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

您需要添加此屬性爲每個可能需要反序列化到StatusLog.Object屬性類型。此外,每種類型都需要可序列化。