XMLSerializer 使用时区序列化 DateTime 属性

XMLSerializer serializing DateTime property with timezone

提问人:Ivan Debono 提问时间:7/26/2023 更新时间:7/26/2023 访问量:38

问:

我有一个具有属性的对象。这些值不包括时区。属性是。然后,我按如下方式序列化对象:DateTimeKindLocal

var settings = new XmlWriterSettings()
{
    Indent = true,
    OmitXmlDeclaration = true
};

using (var sw = new StringWriter())
using (var xw = XmlWriter.Create(sw, settings))
{
    serializer.Serializer.Serialize(xw, myObj);
    myXml = sw.ToString();
}

字符串被序列化,并且在序列化过程中修改了日期属性的值,现在时间部分已添加/减去时区。

我的第一个问题是:序列化程序是否使用系统设置来序列化日期时间属性?

我的实际问题是:有没有办法让序列化程序忽略时区(最好在序列化程序上设置一些属性而不修改对象)?

C# XML 序列化

评论

0赞 dbc 7/26/2023
无法自定义 XmlSerializer 的 DateTime 格式,请参阅是否可以指定日期时间的 XmlSerialization 格式?强制 XmlSerializer 将 DateTime 序列化为“YYYY-MM-DD hh:mm:ss”。在这两个问题中,建议的解决方法是使用代理属性。

答:

0赞 user22239103 7/26/2023 #1

回答第一个问题:是的,如果 DateTime.Kind 属性设置为 Local,则序列化程序使用系统设置来序列化 DateTime 属性。序列化过程根据系统的时区设置将 DateTime 对象转换为 XML 格式。

实际问题的答案:遗憾的是,XmlSerializer 类中没有内置属性,该属性允许您直接控制 DateTime 属性相对于时区的序列化。使用 XmlSerializer 序列化 DateTime 属性时,将根据系统的设置包含时区信息,如果不修改 DateTime 对象本身,则无法直接重写此行为。

如果要避免修改原始对象并确保在序列化过程中不包含时区信息,则可能需要考虑替代方法。一种可能的解决方案是为对象中的每个 DateTime 属性创建一个自定义属性,该属性以特定格式(例如,“yyyy-MM-dd HH:mm:ss”)表示日期和时间,而不包含时区信息。然后,使用 XmlIgnore 属性标记此自定义属性,以便它不会被序列化。您可以使用此定制属性来存储不带时区信息的 DateTime 值,并将原始属性用于应用程序内部使用或计算。

评论

0赞 Ivan Debono 7/26/2023
由于对象是从客户端(网站)到服务器的 DTO,并且我正在使用 NewtonSoft 和 Automapper,也许我可以在那里实现转换。DateKind.Unspecified
0赞 7/26/2023
我认为您正在研究和尝试是个好主意。这样你就会得到更好的理解。我也认为您的解决方案可能会奏效~感谢您的尝试。