c# - 改变 xml 序列化的输出

标签 c# xml serialization controls

web服务响应传回一个xml文件,一个元素是日期类型,其格式有时区信息,例如

12-30-2010T10:00:00+1:00

我的类有一个字段 (DateTime) 来接收值,但是,它只是将日期更改为本地时间。

12-30-2010T10:00:00+1:00

将转换为

12-30-2010T02:00:00(我的本地时间是 CST)。

所以原来的时区信息丢失了。 我想要的只是忽略时区信息的时间,简单地

12-30-2010T10:00:00

或者我可以通过某种方式在响应中提取时区信息,这样我就可以在转换前将转换后的时间调整回原始时间。

有人知道如何在 C# 中执行此操作吗?

谢谢

最佳答案

DateTimeOffsetDateTime 类似,但还保留了原始时区偏移信息。不幸的是,XmlSerializer 不支持 DateTimeOffset(DataContractSerializer 支持,但它不会将其序列化为您期望的字符串)。

如果您也可以选择,我建议您使用 DateTimeOffset 类型和一个附加的 string 属性进行序列化。这是一个例子:

[Serializable]
public class MyClass
{
    const string TimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz";

    [XmlElement("Time")]
    public string TimeString { get{return Time.ToString(TimeFormat);} set{Time = DateTimeOffset.ParseExact(value, TimeFormat, null);} }

    [XmlIgnore]
    public DateTimeOffset Time { get; set; }
}

您的代码将与 Time 属性交互,而 XmlSerializer 将有效地使用 TimeString 属性代替它。然后,您可以精确控制与 xml 之间的转换的处理方式。

如果您不想使用 DateTimeOffset 类型,您可以修改 TimeString 方法来做其他事情(即在一个字段中存储时间和偏移量在另一个领域)。

关于c# - 改变 xml 序列化的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6598814/

相关文章:

c# - Controller 没有收到从表单返回的所有属性

c# - ASP.Net 网页中的强类型全局数据

java - 来自 XML 的 MapView 的 Android InflateException

.net - 防止 WCF 客户端反序列化

c++ - 标记枚举的非侵入式 Boost 序列化 C++

c# - 如何等待操作完成?

c# - Visual Studio 2017 控制台未显示但正在运行

XML 未获取 <camelContext> 标记

XML 模式/命名空间

java - Java中通过反射来转换对象