防止反序列化 List<DateTime> 集合时进行时区转换
Prevent timezone conversion on deserialization of List<DateTime> Collection
我有一个 class,我使用 XmlSerializer 将数据序列化到 XML 个文件和从 XML 个文件中读取数据。
我有几个 DateTime 属性。在 post、Prevent timezone conversion on deserialization of DateTime value 中,答案正确地从 DateTime 属性中删除了时区偏移量。
但是,我有一个 属性,它是我无法从中删除时区的 DateTime 对象列表。
[XmlElement]
public List<DateTime> Times {get; set;}
我已经厌倦了这样的事情,但值始终为 null 并且数据的 none 已正确序列化到列表 属性.
[XmlIgnore]
public List<DateTime> Times {get; set;}
[XmlElement(ElementName = "Times")]
public List<string> TimesString
{
get
{
return Times.ForEach(fe => RemoveTimeZone(fe));
}
set
{
foreach(var v in value)
{
Times.Add(ConvertToDate(v));
}
}
}
值 属性 始终为空,并且两个列表属性始终为空。
我的目标不是创建新的 class,而是以某种方式直接绑定到我的列表属性。
您的 TimesString
属性 是一个 代理集合 属性,即获取或设置基础集合的 属性 ,在此过程中改变其成员。使此类代理集合与 XmlSerializer
一起正常工作的最简单方法是使其成为数组而不是列表,在您的情况下为 string []
:
[XmlIgnore]
public List<DateTime> Times { get; set; }
[XmlElement(ElementName = "Times")]
public string [] TimesString
{
get
{
return Times == null ? null : Times.Select(t => RemoveTimeZone(t)).ToArray();
}
set
{
if (value == null)
return;
(Times = Times ?? new List<DateTime>(value.Length)).AddRange(value.Select(s => ConvertToDate(s)));
}
}
string []
有效而 List<string>
无效,因为 XmlSerializer
反序列化 属性 引用 class 以下列方式实现 IList<T>
:
它调用 getter 来获取列表。如果为 null,它会分配一个列表并通过 setter 设置它。它在填充时保留在某个局部变量中的列表。
它反序列化每个列表元素,并将其添加到它持有的列表中。
就是这样。之后它从不调用包含 class 的 列表 属性 setter。
但是,由于数组基本上是一个只读集合,因此一旦分配就无法添加,因此在完全填充之前无法将其设置回去。这就是 XmlSerializer
所做的,它允许代理数组属性成功反序列化。
有关更多信息,请参阅 Cannot deserialize XML into a list using XML Deserializer or 。
我有一个 class,我使用 XmlSerializer 将数据序列化到 XML 个文件和从 XML 个文件中读取数据。
我有几个 DateTime 属性。在 post、Prevent timezone conversion on deserialization of DateTime value 中,答案正确地从 DateTime 属性中删除了时区偏移量。
但是,我有一个 属性,它是我无法从中删除时区的 DateTime 对象列表。
[XmlElement]
public List<DateTime> Times {get; set;}
我已经厌倦了这样的事情,但值始终为 null 并且数据的 none 已正确序列化到列表 属性.
[XmlIgnore]
public List<DateTime> Times {get; set;}
[XmlElement(ElementName = "Times")]
public List<string> TimesString
{
get
{
return Times.ForEach(fe => RemoveTimeZone(fe));
}
set
{
foreach(var v in value)
{
Times.Add(ConvertToDate(v));
}
}
}
值 属性 始终为空,并且两个列表属性始终为空。
我的目标不是创建新的 class,而是以某种方式直接绑定到我的列表属性。
您的 TimesString
属性 是一个 代理集合 属性,即获取或设置基础集合的 属性 ,在此过程中改变其成员。使此类代理集合与 XmlSerializer
一起正常工作的最简单方法是使其成为数组而不是列表,在您的情况下为 string []
:
[XmlIgnore]
public List<DateTime> Times { get; set; }
[XmlElement(ElementName = "Times")]
public string [] TimesString
{
get
{
return Times == null ? null : Times.Select(t => RemoveTimeZone(t)).ToArray();
}
set
{
if (value == null)
return;
(Times = Times ?? new List<DateTime>(value.Length)).AddRange(value.Select(s => ConvertToDate(s)));
}
}
string []
有效而 List<string>
无效,因为 XmlSerializer
反序列化 属性 引用 class 以下列方式实现 IList<T>
:
它调用 getter 来获取列表。如果为 null,它会分配一个列表并通过 setter 设置它。它在填充时保留在某个局部变量中的列表。
它反序列化每个列表元素,并将其添加到它持有的列表中。
就是这样。之后它从不调用包含 class 的 列表 属性 setter。
但是,由于数组基本上是一个只读集合,因此一旦分配就无法添加,因此在完全填充之前无法将其设置回去。这就是 XmlSerializer
所做的,它允许代理数组属性成功反序列化。
有关更多信息,请参阅 Cannot deserialize XML into a list using XML Deserializer or