使用私有字段通过wcf服务发送对象的问题

时间:2011-09-08 10:20:37

标签: wcf silverlight-4.0 mvvm

我有一个班级Car

public class Car
{
    private Member _owner;

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

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

我在Silverlight应用程序和wcf服务

中都使用它

所以,在应用程序中我调用WCF服务给我一个汽车类的实例,但是当我在应用程序中得到它时,我看到_owner是真的。

我知道由于私有而它是空的,但我该如何处理呢?

我在我的应用程序中使用此类作为模型(MVVM),如果它有帮助:/

3 个答案:

答案 0 :(得分:1)

首先,没有任何属性被标记为DataMembers。该类未标记为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 :(得分:1)

从WCF序列化的角度来看,您的Car类实际上看起来像WCF服务:

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

WCF序列化程序使用.NET类定义作为模板,将其内容序列化为简单的数据传输对象。当WCF服务发回Car实例时,只有公共属性将包含值。序列化程序忽略类中的所有方法。此外,更高版本的WCF不需要DataContract / DataMember属性标记。

_owner变量永远不会被初始化,因为它不是Car类的公共属性的一部分。您需要修改Car类的结构(可能添加Member类型的公共所有者属性)以获取从WCF服务发送到客户端的所有数据。

答案 2 :(得分:1)

当您使用带有WCF服务的默认数据协定序列化程序时,它仅序列化和反序列化该类的公共属性。另外需要注意的是,在反序列化对象图时,不会调用构造函数。你可以拥有一个带有吸气剂和制定者的公共财产。

Here是Jeremy Likeness的一篇非常好的文章,解释了与你类似的问题。从体系结构以及最佳实践的角度来看,在服务层和客户端之间传输对象时,您可以使用通常称为DTO(数据传输对象)的POCO类。