DataContractSerializer - PullRequest
       8

DataContractSerializer

1 голос
/ 27 марта 2012

У меня есть следующий класс

    [DataContract(Namespace = "", Name = "VersionRange")]
    public sealed class VersionRange
    {
        [DataMember(Name = "Lower")]
        private readonly Version _lower;

        [DataMember(Name = "Upper")]
        private readonly Version _upper;

        public VersionRange(Version lower, Version upper)
        {
            _lower = lower;
            _upper = upper;
        }
    }

и я хочу, чтобы de сериализовался из следующего XML

<?xml version="1.0" encoding="utf-8"?>
<VersionRange>
    <Lower>1.2.3.4</Lower>
    <Upper>5.6.7.8</Upper>
</VersionRange>

Я пытался заархивировать это, внедрив IDataContractSurrogate, но безуспешно. Когда я возвращаю typeof(string) для typeof(Version) в GetDataContractType, десериализация метода завершается неудачно, а метод GetDeserializedObject не вызывается.

Итак, есть ли шанс использовать стандартный класс Version и десериализовать его из строки "a.b.c.d"?

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Один из способов сделать это - десериализовать в строковое свойство, а затем в методе set для свойства преобразовать значение в версию.

[DataMember(Name = "Lower")]
private string _lowerStr
{
    set
    {
        _lower = new Version(value);
    }
}

private Version _lower;

/// and the same for Upper.

Я видел это обычно используется для анализазначения даты и времени, которые могут быть предоставлены с неясным форматированием

0 голосов
/ 27 марта 2012

Кажется, вы читаете неверный XML.Правильный XML должен быть примерно таким.

    <?xml version="1.0" encoding="utf-16"?>
<VersionRange xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Lower xmlns:d2p1="http://schemas.datacontract.org/2004/07/System">
    <d2p1:_Build>1</d2p1:_Build>
    <d2p1:_Major>12</d2p1:_Major>
    <d2p1:_Minor>1</d2p1:_Minor>
    <d2p1:_Revision>3</d2p1:_Revision>
  </Lower>
  <Upper xmlns:d2p1="http://schemas.datacontract.org/2004/07/System">
    <d2p1:_Build>1</d2p1:_Build>
    <d2p1:_Major>12</d2p1:_Major>
    <d2p1:_Minor>1</d2p1:_Minor>
    <d2p1:_Revision>3</d2p1:_Revision>
  </Upper>
</VersionRange>
...