簡體   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