2012-03-27 2 views
1

я следующий классDataContractSerializer

[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; 
     } 
    } 

и я хочу, чтобы де сериализации из следующего 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 не вызывается.

Итак, есть ли возможность использовать стандартный класс версии и получить десериализацию от "a.b.c.d"?

ответ

1

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

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

private Version _lower; 

/// and the same for Upper. 

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

+0

Блестящая идея! Благодаря! – adontz

+1

Кроме того, если ваша 'private Version _lower' должна оставаться' readonly', вы можете ее установить, используя отражение в методе '_lowerStr_set'. – Seph

+1

почему -1 голос? – Seph

-1

Кажется, вы читаете неправильно 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> 
Смежные вопросы