我需要通过wcf发送两个类(Person和Address),这些类看起来像这样:
public class PersoanaFizica :IExtensibleDataObject
{
[DataMember]
private Guid _id;
[DataMember(Name = "Id")]
protected virtual Guid Id
{
get { return _id; }
set { _id = value; }
}
private ExtensionDataObject _extensionData;
public virtual ExtensionDataObject ExtensionData
{
get
{
return _extensionData;
}
set
{
_extensionData = value;
}
}
private string _firstName;
[Searchable(PropertyName="FirstName")]
[DataMember]
public virtual string FirstName
{
get { return this._firstName; }
set { this._firstName = value; }
}
private string _lastName;
[Searchable(PropertyName="LastName")]
[DataMember]
public virtual string LastName
{
get { return this._lastName; }
set { this. _lastName = value; }
}
private Address _address;
[Searchable(PropertyName="Address")]
[DataMember]
public virtual Address Address
{
get { return this._address; }
set { this._address = value; }
}
}
public class Address : IExtensibleDataObject
{
[DataMember]
private Guid _id;
[DataMember]
public virtual Guid Id
{
get { return _id; }
set { _id = value; }
}
private ExtensionDataObject _extensionData;
public virtual ExtensionDataObject ExtensionData
{
get
{
return _extensionData;
}
set
{
_extensionData = value;
}
}
private string _country;
[Searchable(PropertyName="Country")]
[DataMember]
public virtual string Country
{
get { return this._country; }
set { this._country = value; }
}
// and some other properties related to the address
}
问题在于,当我尝试通过wcf发送它们时,客户端会收到设置为00000-0000-00000-00000的Id属性或类似内容。
知道为什么会这样吗?以及如何序列化正确的值?
答案 0 :(得分:3)
不,没有帮助。我只是看着 svcutil.exe生成的代码 (这就是我用来生成我的 客户端),我找不到ID 财产。我试过换了 受保护的关键字对公众和 一切正常。看起来 问题在于我 需要保护属性 而不是公开。
Denis - 您的WCF客户端使用XmlSerializer(仅使用get和set方法序列化公共读/写属性)而不是DataContractSerializer的任何机会? DataContractSerializer肯定会序列化受保护的属性或字段 - 它实际上并不关心.NET可见性修饰符....
您应该在生成的WCF客户端代理中看到这一点 - 那里是否有[DataContract]
和[DataMember]
属性,或者您是否看到[XmlElement]
等等?您的WCF客户端代理中的类是否有[DataContractAttribute]
或[XmlTypeAttribute]
?
答案 1 :(得分:1)
您不应该使用DataMember属性标记字段和属性!我有一种感觉,这可能是导致你所看到的问题的原因,但我肯定不知道。但基本上通过将字段及其后备属性标记为DataMember,您将序列化值两次,并且它将被反序列化两次,并且根据客户端代码的生成方式,这甚至可能导致值存储两次。
长话短说,将您的字段标记为DataMember或属性,但不是两者都标记。标记字段可能需要您在DataMemberAttribute上指定名称,以便客户端代码生成创建预期的属性名称。
答案 2 :(得分:0)
您没有以某种方式初始化属性,因此它们分配了默认值。如果为它们分配值,则应正确发送。