在C#中将DateTime属性序列化为XML

3

我是一名编程学生,想知道在将日期序列化为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);

谢谢。
4个回答

2
如果您不想实现 IXmlSerializable,则可以通过将某个后备字段的 DateTime 转换为字符串来解决问题,类似于以下示例:
    public class Loan
    {
        [XmlIgnore]
        private DateTime _dateOut;

        public string OutDate
        {
            get { return _dateOut.ToString("dd-MM-yyyy"); }
            set { _dateOut = DateTime.Parse(value); }
        }
    }

1

实现IXmlSerializable接口可能是最简单的方法,而不是在您的类上实现其他方式。以下是一个示例:

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

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

1
请查看 System.Xml.Serialization 中的 XmlElement 属性类。如果这不起作用,那么 this answer 显示如何使用代理属性。
[XmlElement("TheDate", DataType = "date")]
    public DateTime TheDate { get; set; }

1
我知道现在标记我的答案为“最佳答案”有些晚了,但你可以通过控制序列化来避免实现复杂的接口或使用包装方法。
public DateTime? InDate { get; set }

public bool ShouldSerializeInDate()
{
    return InDate.HasValue;
}

C# XML序列化器有一个文档不太完善的功能。每个公共属性都可以有一个方法来打开或关闭该属性的序列化。该方法必须被称为:ShouldSerializeXYZ,其中XYZ是您想要控制的属性的确切名称。
参见: Xml serialization - Hide null values

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接