2011-09-20 7 views
4

私の質問は、私の周りTimeSpanインスタンスを渡す多くのDTOオブジェクトを持つHow to serialize a TimeSpan to XML.NET(ない同じ質問を!)

の続きです。元のポストで説明されているハックを使用しますが、それぞれとすべてのDT300で同じコードを繰り返してください。TimeSpanプロパティ

だから、私はちょうど罰金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")]を。あなたはこのような何かシリアライズ場合次に、:

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

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

を次のようなXMLを取得します

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 }; 
    } 
} 
関連する問題