【问题标题】:Serialize DateTime property to XML in C#在 C# 中将 DateTime 属性序列化为 XML
【发布时间】:2014-04-08 20:32:52
【问题描述】:

我是一名编程学生,我想知道当我在 xml 文件中序列化日期时是否可以更改日期的格式。此日期是对象“贷款”的 ObservableCollection 的属性,此对象具有两个 DateTime 属性,其中一个日期是可为空的对象。我序列化所有集合,包括日期。

我想在xml文件中获取:

<OutDate> 15-03-2014 </OutDate>
<!--If the date is null I don´t want to appear the node-->

我得到了这个:

 <OutDate>2014-03-15T00:00:00</OutDate>
 <InDate xsi:nil="true" /> 

这是我的代码项目的一部分: 我的类 Loan 的一部分,已经标记为可序列化,如下所示:

    private string isbn;
    private string dni;
    private DateTime dateOut;
    private DateTime? dateIn;    
    // Setters and Gettters and constructors 

这是序列化的方法:

// I will pass three collections to this method loans, books and clients
public void SerializeToXML<T>(string file, string node, ObservableCollection<T> collection)
        {
            XmlRootAttribute root = new XmlRootAttribute(node);
            XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<T>), root);
            using (FileStream fs = new FileStream(file, FileMode.Create))
            {
                serializer.Serialize(fs, collection);
            }
        }

来电:

SerializeToXML<Loan>(_file, "Library", manager.LoansCollection);

谢谢。

【问题讨论】:

    标签: c# xml c#-4.0 datetime serialization


    【解决方案1】:

    我知道将我的答案标记为“那个”已经很晚了,但是您可以控制序列化,而无需实现复杂的接口或包装东西作为解决方法。

    public DateTime? InDate { get; set }
    
    public bool ShouldSerializeInDate()
    {
        return InDate.HasValue;
    }
    

    C# XML 序列化程序的文档记录不太完善。每个公共属性都可以有一个方法来打开或关闭属性的序列化。必须调用该方法:ShouldSerializeXYZ,其中 XYZ 是您要控制的属性的确切名称。

    见: Xml serialization - Hide null values

    【讨论】:

      【解决方案2】:

      查看 XmlElement 属性类(在 System.Xml.Serialization 中)。如果这不起作用,那么this answer 将展示如何使用代理属性

      [XmlElement("TheDate", DataType = "date")]
          public DateTime TheDate { get; set; }
      

      【讨论】:

        【解决方案3】:

        如果您不想实现IXmlSerializable,一些支持字段的 DateTime 到字符串转换应该可以解决问题,如下所示:

            public class Loan
            {
                [XmlIgnore]
                private DateTime _dateOut;
        
                public string OutDate
                {
                    get { return _dateOut.ToString("dd-MM-yyyy"); }
                    set { _dateOut = DateTime.Parse(value); }
                }
            }
        

        【讨论】:

          【解决方案4】:

          实现这一点的最简单方法可能是在您的类上实现IXmlSerializable 接口。大致如下

          public class Loan : IXmlSerializable
          {
              public void WriteXml(XmlWriter writer)
              {
                  if(dateIn.HasValue)
                  {
                      writer.WriteElementString("dateIn", dateIn.Value.ToString());
                  }
              }
          }
          

          在读取时,您需要读取元素名称,如果它是 dateIn 设置,否则设置适当的值。基本上检查它是否存在于 XML 中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多