如何在wcf中序列化受保护的属性

时间:2010-05-30 19:38:18

标签: c# wcf serialization

我需要通过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属性或类似内容。

知道为什么会这样吗?以及如何序列化正确的值?

3 个答案:

答案 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)

您没有以某种方式初始化属性,因此它们分配了默认值。如果为它们分配值,则应正确发送。