2017-06-12 50 views
0

如何讓XsdDataContractExporter爲我的DateTime字段使用xs:time類型?如何指導DataContract使用DateTime或TimeSpan字段的xs:time?

我需要能夠使用DataContract序列化在我的代碼中反序列化HH:mm:ss格式的字符串(例如「21:59:59」)。使用數據類型DateTime並適當標記時,這不是問題:

[DataContract] 
public class TestClass 
{ 
    [DataMember(Name = "Begin")] 
    public DateTime TimeField; 
} 

序列化和反序列化工作正常。 現在我需要能夠XSD驗證字符串中的自動生成從類型爲xsd:因爲XsdDataContractExporter使用XS

XsdDataContractExporter xsdExp = new XsdDataContractExporter(); 
xsdExp.Export(typeof(T)); 
XmlSchemaSet xsdSet = xsdExp.Schemas; 
var xDoc = XDocument.Load(stringReader); 
xDoc.Validate(xsdSet, null); 

驗證失敗:DateTime類型的日期時間,我得到以下錯誤:

Additional information: The 'Begin' element is invalid - The value '05:00:00' is invalid according to its datatype ' http://www.w3.org/2001/XMLSchema:dateTime ' - The string '05:00:00' is not a valid DateTime value.

使用TimeSpan也無濟於事 - 因爲隨後XsdDataContractExporter使用xs:duration(並且DataContractDeserializer無法從HH:mm:ss字符串反序列化TimeSpan)。

有沒有辦法如何繼續使用DataContractSerializer和XsdDataContractExporter並能夠反序列化這些字符串?我們使用幾十個和幾十個複雜的設置類型和xmls - 這是這些utils失敗的唯一情況(所以我想避免爲所有類型寫入自定義驗證和反序列化)

+0

我是使用字符串數據類型的唯一想法 - 放鬆XSD驗證,然後在OnDeserialized方法反序列化。這是非常醜陋的黑客:/ – Jan

回答

0

最後,我用串DataContract(德)序列化,然後時間跨度解析自定義方法中:

public class TestClass 
{ 
    //Storing as string due to xsd validation as XsdDataContractExporter is 
    // using either xs:dataTime for DataTime or xs:duration for TimeSpan. xs:time is not used 
    // And so xsd validation were failing for string in format 'HH:mm:ss' (despite DataContract can deserialize them as DateTime) 
    [DataMember(Name = "Begin")] 
    public string _beginString; 
    [DataMember(Name = "End")] 
    public string _endString; 

    public TimeSpan Begin { get; private set; }; 
    public TimeSpan End{ get; private set; }; 

    [OnDeserialized] 
    private void OnDeserialized(StreamingContext context) 
    { 
     this.Begin = TimeSpan.Parse(_beginString); 
     this.End = TimeSpan.Parse(_endString); 
    } 
} 
相關問題