Как сериализовать защищенное свойство в wcf - PullRequest
2 голосов
/ 30 мая 2010

У меня есть два класса (Person и Address), которые мне нужно отправить через wcf, классы выглядят так:

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, клиент получает свойства Id, установленные на 00000-0000-00000-00000 или что-то вроде этого.

Есть идеи, почему это происходит? А как сериализовать правильные значения?

Ответы [ 3 ]

3 голосов
/ 31 мая 2010

Нет ... не помогло. Я только что посмотрел на код, сгенерированный svcutil.exe (вот что я использую для генерации клиент), и я не мог найти идентификатор собственность вообще. Я пытался изменить защищенное ключевое слово для общественности и все работало нормально. Кажется, что проблема в том, что я нужны свойства для защиты и не публично.

Денис - есть ли шанс, что ваш клиент WCF использует XmlSerializer (который только сериализует общедоступные свойства чтения / записи с помощью метода get и set) вместо DataContractSerializer ?? DataContractSerializer определенно сериализует защищенное свойство или поле - его действительно не волнуют модификаторы видимости .NET ....

Вы должны увидеть это в сгенерированном прокси на стороне клиента WCF - есть ли у вас атрибуты [DataContract] и [DataMember], или вы видите [XmlElement] и так далее? У вашего класса в прокси на стороне клиента WCF есть [DataContractAttribute] или [XmlTypeAttribute] на нем ??

1 голос
/ 30 мая 2010

Вы не должны отмечать и поле, и свойство атрибутами DataMember! У меня такое чувство, что это, вероятно, и является причиной проблемы, с которой вы сталкиваетесь, но я точно не знаю. Но, в основном, пометив поле и его вспомогательное свойство как DataMember's, вы сериализуете значение дважды, и оно будет десериализовано дважды, и в зависимости от того, как генерируется ваш код на стороне клиента, это может даже привести к сохранению значения дважды.

Короче говоря, пометьте ваши поля как DataMember или свойства, но не оба. Для пометки полей может потребоваться указать имя в DataMemberAttribute, чтобы при генерации кода на стороне клиента создавались ожидаемые имена свойств.

0 голосов
/ 30 мая 2010

Вы не инициализируете свойства каким-либо образом, поэтому им назначено значение по умолчанию. Если вы назначите им значение, оно должно быть отправлено правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...