我有一个班级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),如果它有帮助:/
答案 0 :(得分:1)
首先,没有任何属性被标记为DataMembers。该类未标记为DataContract。如果从WCF服务返回,我希望看到:
[Serializable]
[DataContract]
public class Car
{
private Member _owner;
[DataMember]
public string OwnerName
{
//getter
//setter
}
etc..
}
会员必须是私人的吗?它可以转换成财产吗?
请记住,[DataMember]属性需要set和get(以便WCF可以读入和读取对象)。
答案 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类。