2011-09-20 5 views
4

내 문제는 내가 주위 TimeSpan 인스턴스를 통과 많은 DTO 개체가 How to serialize a TimeSpan to XML.NET (안 같은 질문을!)

의 연속이다. 원래 게시물에 설명 된 해킹을 사용하면 작동하지만, 각 TimeSpan 속성에 대해 각각의 모든 DTO에서 동일한 코드 대량을 반복해야합니다.

그래서, 난 잘 직렬화 XML은 다음과 래퍼 클래스와 함께 제공 :

#if !SILVERLIGHT 
[Serializable] 
#endif 
[DataContract] 
public class TimeSpanWrapper 
{ 
    [DataMember(Order = 1)] 
    [XmlIgnore] 
    public TimeSpan Value { get; set; } 

    public static implicit operator TimeSpan?(TimeSpanWrapper o) 
    { 
    return o == null ? default(TimeSpan?) : o.Value; 
    } 

    public static implicit operator TimeSpanWrapper(TimeSpan? o) 
    { 
    return o == null ? null : new TimeSpanWrapper { Value = o.Value }; 
    } 

    public static implicit operator TimeSpan(TimeSpanWrapper o) 
    { 
    return o == null ? default(TimeSpan) : o.Value; 
    } 

    public static implicit operator TimeSpanWrapper(TimeSpan o) 
    { 
    return o == default(TimeSpan) ? null : new TimeSpanWrapper { Value = o }; 
    } 

    [JsonIgnore] 
    [XmlElement("Value")] 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    public long ValueMilliSeconds 
    { 
    get { return Value.Ticks/10000; } 
    set { Value = new TimeSpan(value * 10000); } 
    } 
} 

문제는 XML은 모양과 같이 생산한다는 것입니다 : 대신의

<Duration> 
    <Value>20000</Value> 
</Duration> 

천연

<Duration>20000</Duration> 

내 질문은 "케이크를 먹어서 전체로 먹을 수 있습니까? 동일한 반복적 인 코드로 모든 DTO를 어지럽히 지 않고 자연스럽게 보이는 XML을 가지고 설명 된 해킹을 즐기십시오.

감사합니다.

답변

4

변경 [XmlElement("Value")]을. 이 같은 직렬화 경우 :

[Serializable] 
public class TestEntity 
{ 
    public string Name { get; set; } 
    public TimeSpanWrapper Time { get; set; } 
} 

는이 같은 XML을 얻을 것이다 :

<TestEntity> 
    <Name>Hello</Name> 
    <Time>3723000</Time> 
</TestEntity> 
0

당신은 IXmlSerializable을 구현해야합니다 : [XmlText]

[Serializable,XmlSchemaProvider("TimeSpanSchema")] 
public class TimeSpanWrapper : IXmlSerializable 
{ 
    private TimeSpan _value; 

    public TimeSpanWrapper() 
    { 
     _value = TimeSpan.Zero; 
    } 

    public TimeSpanWrapper(TimeSpan value) 
    { 
     _value = value; 
    } 

    public XmlSchema GetSchema() { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) { 
     _value = XmlConvert.ToTimeSpan(reader.ReadElementContentAsString()); 
    } 

    public void WriteXml(XmlWriter writer) { 
     writer.WriteValue(XmlConvert.ToString(_value)); 
    } 

    public static XmlQualifiedName TimeSpanSchema(XmlSchemaSet xs) 
    { 
     return new XmlQualifiedName("duration", "http://www.w3.org/2001/XMLSchema"); 
    } 

    public static implicit operator TimeSpan?(TimeSpanWrapper o) 
    { 
     return o == null ? default(TimeSpan?) : o._value; 
    } 

    public static implicit operator TimeSpanWrapper(TimeSpan? o) 
    { 
     return o == null ? null : new TimeSpanWrapper { _value = o.Value }; 
    } 

    public static implicit operator TimeSpan(TimeSpanWrapper o) 
    { 
     return o == null ? default(TimeSpan) : o._value; 
    } 

    public static implicit operator TimeSpanWrapper(TimeSpan o) 
    { 
     return o == default(TimeSpan) ? null : new TimeSpanWrapper { _value = o }; 
    } 
}