2011-09-02 39 views
1

如何解決在共享客戶端庫中定義的抽象類以及服務器端庫中的具體實現的序列化問題。客戶端lib中的抽象類和共享庫中的具體類

Interface in shared client library : 

    [ServiceContract(SessionMode=SessionMode.Required)] 
    [ServiceKnownType(typeof(SharedClient.Shape))] 
    public interface IMyInterface 
    { 
    void UploadDrawing(Drawing dr); 
    } 

Concreate Drawing class in shared client library : 

    [DataContract] 
    [KnownType(typeof(SharedClient.Shape))] 
    public class Drawing 
    { 
    public Shape s; 
    } 

Abstract class in shared client library : 

    [DataContract] 
    abstract public class Shape 
    { 
    [DataMember] 
    public abstract string Name; 
    } 

Concrete class implementation in separate library which references the client library : 

    [DataContract] 
    public class Cirle : ClientLibrary.Shape 
    { 
    public override string Name { get; set; } 
    } 

我不斷收到異常消息:

而試圖序列參數 http://tempuri.org/:Drawing時出錯。 InnerException消息是'輸入 'Circle',數據協定名稱爲 'Circle:http://schemas.datacontract.org/2004/07/'不是預期的。 考慮使用DataContractResolver或將靜態添加到已知類型列表的所有類型 - 例如,使用 KnownTypeAttribute屬性或將它們添加到傳遞給DataContractSerializer的已知 類型的列表中。有關更多詳細信息,請參閱InnerException 。

+0

請不要在您的標題中加入「WCF - 」之類的內容。在[SO]上,標籤更好地服務於相同的目的。 –

回答

1

KnownType以其他方式工作。如果你想使用KnownType屬性,你必須使用它的基類來定義其子:

[DataContract] 
[KnownType(typeof(Circle))] 
abstract public class Shape 
{ 
    [DataMember] 
    public abstract string Name; 
} 

這不會是你的情況太多幫助。嘗試把ServiceKnownType與具體類的接口:

[ServiceContract(SessionMode=SessionMode.Required)] 
[ServiceKnownType(typeof(Circle))] 
public interface IMyInterface 
{ 
    void UploadDrawing(Drawing dr); 
} 

你不必定義ShapeServiceKnownType - 它是已知的,因爲它是在Drawing使用,但尚未WCF不知道Circle類型。

+0

拉迪斯拉夫,感謝答覆。我無法將具體類Circle作爲ServiceKnownType放置,因爲它在庫中定義,它引用了定義抽象類和接口的客戶端庫。會有循環引用。 –

+0

在這種情況下,您必須重新設計您的庫 - 服務必須知道它使用的類型。 –

+0

謝謝。我猜你是對的。需要重新設計。令人驚訝的是,該設計在.NET遠程處理中起作用。 –