Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用XmlDateTimeSerializationMode标记XML DateTime属性?_C#_Datetime_Serialization - Fatal编程技术网

C# 如何使用XmlDateTimeSerializationMode标记XML DateTime属性?

C# 如何使用XmlDateTimeSerializationMode标记XML DateTime属性?,c#,datetime,serialization,C#,Datetime,Serialization,是否有任何方法可以定义如何使用类似于XmlAttribute标记的东西序列化/反序列化DateTime?过去,我会将字段设置为字符串,然后在构造函数中执行类似操作: this.DateField = XmlConvert.ToString(passedObject.Date, XmlDateTimeSerializationMode.Utc); 但是,我希望该字段实际上是一个日期时间,并以某种方式标记它应序列化为UTC: [System.Xml.Serialization.XmlAttribu

是否有任何方法可以定义如何使用类似于XmlAttribute标记的东西序列化/反序列化DateTime?过去,我会将字段设置为字符串,然后在构造函数中执行类似操作:

this.DateField = XmlConvert.ToString(passedObject.Date, XmlDateTimeSerializationMode.Utc);
但是,我希望该字段实际上是一个日期时间,并以某种方式标记它应序列化为UTC:

[System.Xml.Serialization.XmlAttribute()] // XmlDateTimeSerializationMode tag here?
public DateTime DateField;

我该怎么做呢?

我不确定您是否可以通过属性来完成这项工作,因为您跨越了从按原样序列化数据到转换数据再序列化的过程

通过更改表示数据的方式,添加受UTC保护的属性,您可能会得到相同的结果,即:

public DateTime DateField;

[System.Xml.Serialization.XmlAttribute("DateField")]
protected DateTime UtcDateField
{
    get
    {
        //Convert DateField to UTC
    }

    set
    {
        DateField = //Convert value from UTC
    }
}

我不确定您是否可以通过属性来完成这项工作,因为您跨越了从按原样序列化数据到转换数据再序列化的界限

通过更改表示数据的方式,添加受UTC保护的属性,您可能会得到相同的结果,即:

public DateTime DateField;

[System.Xml.Serialization.XmlAttribute("DateField")]
protected DateTime UtcDateField
{
    get
    {
        //Convert DateField to UTC
    }

    set
    {
        DateField = //Convert value from UTC
    }
}

另一个选项是继承
IXmlSerializable
接口,并手动处理序列化的所有读写操作。它不像属性那样简洁或自动,但它将为您提供所需的控制,我认为这比仅为序列化过程创建特殊格式化字段更容易理解。

另一个选项是继承
IXmlSerializable
接口并处理序列化的所有读写操作手动。它不像属性那样简洁或自动,但它将为您提供所需的控制,我认为这比仅为序列化过程创建特殊格式的字段更容易理解。

谢谢Matt!事实上,我最终不得不在real DateField中添加一个XmlIgnore属性,否则它会将其序列化为一个元素。谢谢Matt!事实上,我最终不得不向real DateField添加一个XmlIgnore属性,否则它会将其序列化为一个元素。我有一个问题,日期没有序列化为Zulu(UTC),这是因为日期不是UTC,即使我认为是。再次检查您的代码!您错过了一些所需的SpecifyKind(…,…UTC)呼叫。(这只是给下一个无法在XML序列化日期末尾添加Z的人的一个提示。)@Mark Hurd只是想澄清一下。如果我使用XmlSerializer对XML进行反序列化,并且在XML中xs:dateTime值附加了“Z”,则我的dateTime属性将其dateTime.Kind属性设置为DateTimeKind.Utc。这是正确的吗?@RickRoth我希望如此,但我不知道——我们的应用程序只将其用于序列化。我遇到了一个问题,日期没有序列化为Zulu(UTC),这是因为日期不是UTC,尽管我认为是。再次检查您的代码!您错过了一些所需的SpecifyKind(…,…UTC)呼叫。(这只是给下一个无法在XML序列化日期末尾添加Z的人的一个提示。)@Mark Hurd只是想澄清一下。如果我使用XmlSerializer对XML进行反序列化,并且在XML中xs:dateTime值附加了“Z”,则我的dateTime属性将其dateTime.Kind属性设置为DateTimeKind.Utc。这是正确的吗?@RickRoth我希望如此,但我不知道——我们的应用程序只将其用于序列化。