繁体   English   中英

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

[英]Serialize DateTime property to XML in C#

我是一名编程专业的学生,​​我想知道在将日期序列化为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" /> 

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

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

Thnks。

如果您不想实现IXmlSerializable ,则可以使用一些DateTime到后备字段的字符串转换来解决问题,如下所示:

    public class Loan
    {
        [XmlIgnore]
        private DateTime _dateOut;

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

可能最简单的方法是在类上实现IXmlSerializable接口。 遵循以下内容

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

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

看一下XmlElement属性类(在System.Xml.Serialization中)。 如果这不起作用,那么此答案将显示如何使用代理属性

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

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

public DateTime? InDate { get; set }

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

C#XML序列化器的文档功能不够完善。 每个公共财产都可以使用一种方法来打开或关闭该财产的序列化。 该方法必须被调用: ShouldSerializeXYZ ,其中XYZ是您要控制的属性的确切名称。

请参阅: Xml序列化-隐藏空值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM