通过带有专用字段的wcf服务发送对象时出现问题

通过带有专用字段的wcf服务发送对象时出现问题,wcf,silverlight-4.0,mvvm,Wcf,Silverlight 4.0,Mvvm,我有一辆classCar public class Car { private Member _owner; public string OwnerName { get { return _owner.Name; } } public Car(Member owner) { _owner = owner; } } 我在Silverlight应用程序和wcf服务中都使用它 所以,在应用程序中,我调用WCF

我有一辆class
Car

public class Car
{
    private Member _owner;

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

    public Car(Member owner)
    {
        _owner = owner;
    }
}
我在Silverlight应用程序和wcf服务中都使用它

所以,在应用程序中,我调用WCF服务来提供car类的实例,但当我在应用程序中得到它时,我看到
\u owner
是empy

我知道它是空的,因为私人的,但我如何处理它


如果可能的话,我正在我的应用程序中使用这个类作为模型(MVVM)://

首先,您的属性都没有标记为DataMembers。该类未标记为DataContract。如果这是从WCF服务返回的,我希望看到:

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

      etc..
}  
会员必须是私人的吗?它能转换成一个财产吗

请记住,[DataMember]属性需要一个set和一个get(以便WCF可以读入和读入对象)


首先,没有任何属性被标记为DataMembers。该类未标记为DataContract。如果这是从WCF服务返回的,我希望看到:

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

      etc..
}  
会员必须是私人的吗?它能转换成一个财产吗

请记住,[DataMember]属性需要一个set和一个get(以便WCF可以读入和读入对象)


从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服务发送到客户端的所有数据。

从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的public Owner属性),以获取从WCF服务发送到客户端的所有数据。

当您将默认数据协定序列化程序与WCF服务一起使用时,它只序列化和反序列化类的公共属性。还要注意的另一件事是,在反序列化对象图时,不会调用构造函数。可以使用getter和setter拥有公共属性


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

在WCF服务中使用默认数据协定序列化程序时,它只序列化和反序列化类的公共属性。还要注意的另一件事是,在反序列化对象图时,不会调用构造函数。可以使用getter和setter拥有公共属性

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