【问题标题】:Prevent timezone conversion on deserialization of List<DateTime> Collection防止在 List<DateTime> 集合的反序列化时进行时区转换
【发布时间】:2016-06-28 23:26:35
【问题描述】:

我有一个类,我使用 XmlSerializer 来序列化与 XML 文件之间的数据。

我有几个 DateTime 属性。在帖子中,Prevent timezone conversion on deserialization of DateTime value 的答案正确地从 DateTime 属性中删除了时区偏移量。

但是,我有一个属性,它是我无法从中删除时区的 DateTime 对象列表。

[XmlElement]
public List<DateTime> Times {get; set;}

我已经厌倦了这样的事情,但该值始终为 null,并且没有任何数据被正确序列化到 list 属性。

[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));
   }
 }


}

value 属性始终为空,两个列表属性始终为空。

我的目标不是创建一个新类,而是以某种方式直接绑定到我的列表属性。

【问题讨论】:

    标签: c# xml datetime serialization xmlserializer


    【解决方案1】:

    您的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&lt;string&gt; 无效,因为 XmlSerializer 按以下方式反序列化引用实现 IList&lt;T&gt; 的类的属性:

    1. 它调用 getter 来获取列表。如果为 null,它分配一个列表并通过 setter 设置它。它在填充列表时保留在某个局部变量中的列表。

    2. 它反序列化每个列表元素,并将其添加到它所持有的列表中。

    3. 就是这样。之后它永远不会调用包含类的 list 属性设置器

    但是,由于数组基本上是只读集合,因此一旦分配就无法添加,因此在完全填充之前无法将其设置回去。这就是XmlSerializer 所做的,它允许代理数组属性成功反序列化。

    如需了解更多信息,请参阅Cannot deserialize XML into a list using XML DeserializerXML Deserialization of collection property with code defaults

    【讨论】:

    • 为迟到的回复道歉 - 这是正确的答案并且有效。谢谢!
    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多