2011-09-08 75 views
0

我有一個類的對象發送Car問題通過WCF服務與私人領域

public class Car 
{ 
    private Member _owner; 

    public string OwnerName 
    { 
     get { return _owner.Name; } 
    } 

    public Car(Member owner) 
    { 
     _owner = owner; 
    } 
} 

我使用它無論是在Silverlight應用程序和WCF服務

因此,在應用程序調用我WCF服務給我汽車類的實例,但是當我在應用程序中得到它時,我看到_owner是empy。

我知道它是空的,因爲私密,但我該如何處理它?

我使用這個類在我的應用程序的模型(MVVM),如果它可以幫助:/

回答

1

一開始沒有你的屬性被標記爲數據成員。該類未標記爲DataContract。如果這是從WCF服務返回,我期望看到:

[Serializable] 
[DataContract] 
public class Car 
{ 
     private Member _owner; 
     [DataMember] 
     public string OwnerName 
     { 
      //getter 
      //setter 
     } 

     etc.. 
} 

會員必須是私人的嗎?它可以轉換成一個屬性?

請記住,[DataMember]屬性需要set和get(以便WCF可以讀取和從對象中讀取)。

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

1

從一個WCF系列化點,汽車類實際上看起來像這樣的WCF服務:

public class Car 
{ 
    public string OwnerName { get; set; } 
    //other public properties here.... 
} 

的WCF序列化使用.NET類定義爲一個模板將其內容作爲簡單的數據傳輸對象進行序列化。當WCF服務發回Car實例時,只有公共屬性將包含值。序列化器忽略類中的所有方法。此外,WCF的更高版本不需要DataContract/DataMember屬性標記。

_owner變量從不初始化,因爲它不是Car類的公共屬性的一部分。您需要修改Car類的結構(可能會添加一個類型爲Member的Public Owner屬性),以獲取從WCF服務發送到客戶端的所有數據。

1

當您將默認的Data Contract Serializer與WCF服務一起使用時,它僅對該類的公共屬性進行序列化和反序列化。還有一點要注意的是,雖然反序列化對象圖的構造函數不會被調用。你可以擁有一個擁有getter和setter的公共財產。

Here是由Jeremy Likeness解釋類似於您的問題的一篇非常不錯的文章。從架構以及最佳實踐的角度來看,您可以在服務層和客戶端之間傳輸對象時使用通常稱爲DTO(數據傳輸對象)的POCO類。