【问题标题】:Serialized XML Date Time value is not correct序列化 XML 日期时间值不正确
【发布时间】:2016-07-22 10:34:51
【问题描述】:

我对序列化 XML 有疑问。我有一个具有 DateTime 属性的对象,其中毫秒值为 990。但是,当我查看输出的字符串时,它显示如下...

<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;

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    .990 与 .99 相同,它是一个小数,所以最后一个 0 数字被删除。数字的重要性从左侧开始到右侧。示例:

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

    序列化程序只是删除尾随的 0 数字。如果您想始终捕获任何尾随 0 数字(不知道为什么会这样),您可以添加自定义字符串属性并指定要序列化并在其中读取的确切输出并忽略 DateTime 属性,请参阅前面的 SO post 作为示例.

    【讨论】:

    • 这是 .Net 特定的“东西”。创建 xml 以发布到 Api。如果该系统是 Java,他们会将毫秒部分也视为小数吗?
    • @Hyder - 它不是特定于 .net 的任何东西,但这就是 XmlSerializer 序列化毫秒值的小数部分的方式,这很有意义,因为尾随 0s 不添加任何价值。结果可能会有所不同,具体取决于序列化程序用户和编写者,但字符串/序列化值应该能够被解析/反序列化回相同的 DateTime 值。至于 Java,我猜它是一样的,但我不知道 Java,所以不能肯定地说。
    猜你喜欢
    • 2017-12-29
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2016-04-16
    • 2010-09-23
    • 2017-01-16
    相关资源
    最近更新 更多