2016-07-22 104 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