2016-07-22 103 views
0

序列化XML存在問題。我有一個DateTime屬性的對象,其中毫秒值是990。然而,當我查看輸出字符串它顯示像這樣...序列化XML日期時間值不正確

<ReadingsDateTime>2016-07-04T10:10:00.99Z</ReadingsDateTime> 

用於將其轉換爲XML的代碼如下,是什麼繼續,我無法找到發生這種情況的原因。

string xml; 

try 
{  
    var serializer = new XmlSerializerFactory().CreateSerializer(typeof(T), xmlNamespace); 

    using (var memoryStream = new MemoryStream()) 
    { 
     var settings = new XmlWriterSettings 
     { 
      Indent = false, 
      NamespaceHandling = NamespaceHandling.OmitDuplicates, 
      CloseOutput = false, 
      WriteEndDocumentOnClose = true, 
     }; 

     using (var xmlWriter = XmlWriter.Create(memoryStream, settings)) 
     { 
      serializer?.Serialize(xmlWriter, obj); 
     } 

     memoryStream.Seek(0, SeekOrigin.Begin); 

     using (var steamReader = new StreamReader(memoryStream)) 
     { 
      xml = steamReader.ReadToEnd(); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    throw new ApplicationException("Unable to convert to XML from an object", ex); 
} 

return xml; 

回答

3

.990與0.99相同,它是一個小數,所以最後的0位被丟棄。數字從左側開始並且從右側開始具有重要性。例如:

  • 1.0000是相同的值1
  • 2.94是相同的值2.940或2.9400或2.94000。

串行器只刪除尾隨的0位。如果要始終捕獲任何尾隨的0位數(不確定原因),可以添加自定義字符串屬性並指定要序列化的確切輸出並在其中讀取並忽略DateTime屬性,請參閱此前的SO post作爲示例。

+0

這是一個.Net特定的'事情'。 xml被創建爲發佈到Api。如果這個系統是Java的話,他們會把毫秒部分當作一個分數來處理呢? – Geek

+2

@Hyder - 它沒有任何特定的.net,但這就是'XmlSerializer'如何序列化毫秒值的分數部分,這是有道理的,因爲尾部'0'不添加任何有價值的東西。結果可能會有所不同,具體取決於序列化器用戶以及編寫者的身份,但字符串/序列化值應該能夠以任何方式解析/反序列化回相同的DateTime值。就Java而言,我猜測它是相同的,但我不知道Java,因此無法肯定地說。 – Igor