2010-03-08 15 views
5

का उपयोग कर डेटाटाइप = "समय" फ़ील्ड को क्रमबद्ध करना XmlSerializer का उपयोग करते हुए डेटटाइम फ़ील्ड को क्रमबद्ध करते समय मुझे एक अजीब परिणाम मिल रहा है।XmlSerializer

public class RecordExample 
{ 
    [XmlElement("TheTime", DataType = "time")] 
    public DateTime TheTime { get; set; } 

    [XmlElement("TheDate", DataType = "date")] 
    public DateTime TheDate { get; set; } 

    public static bool Serialize(
     Stream stream, object obj, Type objType, Encoding encoding) 
    { 
     try 
     { 
      var settings = new XmlWriterSettings { Encoding = encoding }; 

      using (var writer = XmlWriter.Create(stream, settings)) 
      { 
       var xmlSerializer = new XmlSerializer(objType); 
       if (writer != null) xmlSerializer.Serialize(writer, obj); 
      } 

      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 
} 

जब मैं निम्नलिखित परीक्षण कोड के साथ प्रयोग के XmlSerializer फोन:

var obj = new RecordExample 
{ 
    TheDate = DateTime.Now.Date, 
    TheTime = new DateTime(0001, 1, 1, 12, 00, 00) 
}; 

var ms = new MemoryStream(); 

RecordExample.Serialize(ms, obj, typeof(RecordExample), Encoding.UTF8); 
txtSource2.Text = Encoding.UTF8.GetString(ms.ToArray()); 

मैं कुछ अजीब परिणाम प्राप्त है, यहाँ एक्सएमएल उत्पादन किया है कि है

मैं निम्नलिखित वर्ग है:

<?xml version="1.0" encoding="utf-8"?> 
<RecordExample 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <TheTime>12:00:00.0000000+00:00</TheTime> 
    <TheDate>2010-03-08</TheDate> 
</RecordExample> 

किसी भी विचार कैसे मैं "thetime" तत्व प्राप्त कर सकते हैं एक समय क को रोकने के लिए है ich इस तरह दिखता है:

<TheTime>12:00:00.0Z</TheTime> 

... जैसा कि मैं उम्मीद कर रहा था?

धन्यवाद

डेव

+0

संभावित डुप्लिकेट [सीरियलाइजिंग डेटटाइम बिना मिलीसेकंड और जीएमटी के समय] (http://stackoverflow.com/questions/101533/serializing-datetime-to-time-without-milliseconds-and-gmt) –

उत्तर

1
+0

Wooo यह है कि असली। मुझे एक गंदे हैक की तरह लग रहा है .. ऐसा करने के लिए कोई अच्छा तरीका नहीं है? – CraftyFella

+1

@CraftyFella, आप 'IXmlSerializable' को कार्यान्वित कर सकते हैं, लेकिन फिर आपको सभी धारावाहिक तर्क के लिए कार्यान्वयन प्रदान करने की आवश्यकता है। –

+1

जहां तक ​​मुझे पता है यह एकमात्र समाधान है। जब मुझे ऐसा करना होता है तो मैं इसे दूसरी संपत्ति के साथ करता हूं। अगर आपको बेहतर समाधान मिल जाए तो कृपया मुझे बताएं। एक समाधान जिसमें आपके स्वयं के XmlSerializer – IordanTanev

2

मैं अपने आप को इस के साथ विभिन्न मुद्दों लिया है पर एक नज़र डालें ... लेकिन मैं एक TimeSpan वस्तु क्रमानुसार करने का प्रयास कर रहा था। समाधान दो गुणों का था, जिसमें टाइमस्पेन था, और वह टाइमस्पेन का एक स्ट्रिंग प्रस्तुति था जिसे सीरियलाइज्ड मिला।

[XmlIgnore] 
public TimeSpan ScheduledTime 
{ 
    get; 
    set; 
} 

[XmlElement("ScheduledTime", DataType="duration")] 
public string XmlScheduledTime 
{ 
    get { return XmlConvert.ToString(ScheduledTime); } 
    set { ScheduledTime = XmlConvert.ToTimeSpan(value); } 
} 

हालांकि, इस कोड के साथ, समय के लिए बाहर निम्न स्वरूप में छपा है:

<ScheduledTime>PT23H30M</ScheduledTime> 

The W3C definition of duration is here which explains it यहाँ पैटर्न था।

1

अन्य उत्तरों में से एक पर टिप्पणी की गई टिप्पणी पर विस्तार।

public class RecordExample : IXmlSerializable 
{ 
    public DateTime TheTime { get; set; } 
    public DateTime TheDate { get; set; } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     // TODO : Deserialization logic here 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteElementString(
      "date", 
      this.TheDate.ToString("yyyy-MM-dd")); 

     writer.WriteElementString(
      "time", 
      this.TheTime.ToString("hh:mm:ss.fK")); 
    } 
} 

इस तरह Serializing:

var rc = new RecordExample() 
{ 
    TheDate = DateTime.Today, 
    TheTime = DateTime.UtcNow 
}; 

var serializer = new XmlSerializer(typeof(RecordExample)); 

var ms = new MemoryStream(); 

serializer.Serialize(ms, rc); 

ms.Seek(0, SeekOrigin.Begin); 

Console.WriteLine(new StreamReader(ms).ReadToEnd()); 

आउटपुट उदाहरण:

<?xml version="1.0"?> 
<RecordExample> 
    <date>2010-03-08</date> 
    <time>04:26:16.1Z</time> 
</RecordExample> 
+0

लिखना शामिल नहीं है .. यह एक निश्चित विकल्प है। UtcNow के बारे में भी नहीं पता था। – CraftyFella

1

मैं अन्य उत्तर (मैं लिख जब वे पॉप नहीं किया गया था) से सहमत हुई। ऐसा लगता है कि यह प्रत्यक्ष तरीके से संभव नहीं है। परावर्तक के साथ स्रोत पर एक नजर डालने से पता चलता है कि एक समय मूल्य System.Xml.XmlConvert.ToString के साथ एक स्ट्रिंग के लिए परिवर्तित किया जा रहा समाप्त होता है, की एक हार्ड-कोडेड प्रारूप है:

HH: mm: ss.fffffffzzzzzz

तो दो गुण होने के कारण, असली [XmlIgnore] और एक स्ट्रिंग जिसे आप स्वयं बनाते हैं, वह जाने का एक अच्छा तरीका है।

+0

इसे जांचने के लिए बहुत गहन धन्यवाद .. – CraftyFella