2011-11-17 18 views
0

感謝您的快速解答。但我正在尋找一個答案,而不是一個workoaround(序列化爲字符串),因爲我想知道如何使用框架中的其他類型WCF和System.Drawing.Color

我很擅長WCF,但我認爲我仍然處於初學者階段因爲我無法序列化System.Drawing.Color。

這是我的服務合同

using System.Drawing; 
using System.ServiceModel; 

namespace wcfServer 
{ 

    [ServiceContract] 
    public interface IColorService 
    { 
     [OperationContract] 
     Color DoWork(); 
    } 
} 

這裏是一個實現

public class ColorService : IColorService 
{ 
    public Color DoWork() 
    { 
     return Color.Yellow; 
    } 
} 

然而,在客戶端WCF不使用一個System.Drawing.Color但它產生它自己的顏色類型(結構)?

最終的結果是,顏色發黃並沒有在客戶端

到達我想,既然.NET顏色類型標有Seri​​alizable屬性

親切的問候,這不是一個問題,湯姆

+0

發回你想要的顏色的字符串表示會不容易嗎?然後將其轉換爲客戶端上的顏色。或者是否有你想通過WCF發送Color對象的特定原因? – stuartmclark

回答

1

但是,在客戶端WCF不使用System.Drawing.Color,但它生成它自己的顏色類型(結構)? [...]我以爲這是不是一個問題,因爲.NET顏色類型被標記爲可序列化的屬性

我假設你在這裏使用basicHttp或wsHttp。我所說的並不適用於所有綁定。

WCF服務和客戶端之間的通信與.NET無關。關鍵字是互操作性。客戶端不必用.NET編寫,它可能是一個PHP或Java或任何類型的客戶端。

因此,WCF使用SOAP發送和接收所有主要編程語言實現的數據。因此,爲了讓服務和客戶交換數據,必須定義該數據的格式。你不能說「嗨,我會發送一個System.Drawing.Color」,因爲這可能不是客戶端語言中有效的類或結構定義。

所以你的服務定義了WSDL,包含架構定義,其中Color結構的內容將來自System.Drawing.Color被複制。它不會被鏈接到.NET框架,從它被序列化並通過網絡發送。

3

顏色通常是一團糟 - 有這麼多。只需將顏色轉換爲32位ARGB結構(Color類具有這樣的方法)並將其用於WCF界面即可。如果你想要特別小心,用A,R,G和B定義你自己的結構(以字節爲單位,WPF將它們定義爲雙精度,但沒有人真正需要它),並將你的服務與任何特定的UI平臺分離。

+0

這應該是被接受的答案。不要序列化顏色,請使用標準和簡單的argb值而不是.NET類型。 –

0

我能夠通過在數據合同上使用「KnownTypeAttribute」來解決此問題。所以,你可以試試「ServiceKnownTypeAttribute」在這樣一個服務合同:

[ServiceContract] 
[ServiceKnownType(typeof(System.Drawing.Color))] 
public interface IColorService 
{ 
    [OperationContract] 
    Color DoWork(); 
} 

這正常假設客戶端代碼也使用.NET。 「KnownType」策略在我的項目http://www.nquotes.net/中運行良好,讓我避免了額外的序列化麻煩。它們應該包括Color作爲基本類型之一(例如,它與Guid一起使用,例如,它自動「已知」 - http://msdn.microsoft.com/en-us/library/ms731923.aspx)。