DataContract Serialization - имена свойств базового класса не работают - PullRequest
1 голос
/ 02 февраля 2010

У меня есть базовый класс, подобный следующему:

[Serializable]
public class SerializableDomainObject<T>
{
    public SerializableDomainObject()
    {
        ID = Guid.NewGuid();
    }

    [DataMember(Name="ID", Order = 0)]
    public Guid ID { get; private set; }

    public void Save()
    {
        // serialize
    }

    public void Load()
    {
        // deserialize
    }
}

У меня есть множество производных классов, вот пример одного из них:

[DataContract(Name="MyDomainObject")]
public class MyDomainObject : SerializableDomainObject<MyDomainObject>
{
    public MyDomainObject()
    {
    }

    public MyDomainObject(string name)
    {
        Name = name;
    }

    [DataMember(Order = 1)]
    public string Name { get; private set; }
}

После сериализации здесь вывод:

<MyDomainObject xmlns="http://schemas.datacontract.org/2004/07/DomainObjects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <_x003C_ID_x003E_k__BackingField>2b3c00f6-1b15-4a6b-bd6c-a1f447ea5a34</_x003C_ID_x003E_k__BackingField>
    <Name>AName</Name>
</MyDomainObject>

Почему свойство ID не сериализуется с именем, которое я указал в атрибуте DataMember в базовом классе?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2010

Это потому, что вы объявили этот установщик для свойства как private - поскольку он является частным, DataContractSerializer сериализует вспомогательное поле и использует его имя, а не свойство.

DataContractSerializer с радостью сериализует всех членов, которых вы просите, но с учетом семантики языка. Обычно лучше всего объявлять ваши контракты данных просто и без особого контроля видимости, как это, потому что контракт сообщения между сервисом и клиентом должен быть простым и простым в использовании. Создавайте открытые и неограниченные контракты на данные, но блокируйте свои контракты на эксплуатацию.

0 голосов
/ 02 февраля 2010

Можете ли вы изменить частную декларацию на внутреннюю? Это все еще достигнет ваших потребностей видимости? У меня это есть в моих контрактах, и все очень хорошо сериализуется / десериализуется.

...