簡體   English   中英

C#中的XmlSerializer /反序列化

[英]XmlSerializer/Deserialize in C#

我創建了該類,該類將附加到名為“電子郵件警報” h1,body和id的XML上。 但是,當文件不存在時,從頭開始運行該文件時(當我調用LoadFromFile時)遇到了麻煩-因此我們必須創建一個文件並開始對其進行記錄。

public class EMailAlert
{
    public string h1 { get; set; }
    public string body { get; set; }
    public string idList { get; set; }

    public void Save(string fileName)
    {
        using (var stream = new FileStream(fileName, FileMode.Create))
        {
            var XML = new XmlSerializer(typeof(EMailAlert));
            XML.Serialize(stream, this);
        }
    }

    public static EMailAlert LoadFromFile(string fileName)
    {
        if (!File.Exists(fileName))
        {
            var file = new FileInfo(fileName);
            file.Directory.Create();
            var xmlFile = new XDocument(
            new XDeclaration("1.0", "utf-8", "yes"),
            new XComment("Email Logger"));
            xmlFile.Add(new XElement("EmailAlerts"));
            xmlFile.Save(fileName);
        }
        using (var stream = new FileStream(fileName, FileMode.Open))
        {
            var XML = new XmlSerializer(typeof(EMailAlert));
            return (EMailAlert)XML.Deserialize(stream);
        }
    }
}

當我運行此代碼時(沒有xml文件-因此它創建了一個XML文件,然后引發了此錯誤{"<EmailAlerts xmlns=''> was not expected."}

這是xml文件的樣子

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--Email Logger-->
<EmailAlerts />

不知道為什么當我調用LoadFromFile時它沒有發回空的EmailAlert。

您需要將所有EMailAlerts序列化為有效xml的collectiontype。

下面的代碼可以做到這一點。 通過創建一個靜態幫助器類,其中包含我們所有EmailAlerts的靜態列表。 它還具有Load和Save方法,該方法讀取和寫入文件,並使用Alerts屬性獲取或存儲EmailAlerts。

如果要控制序列化,可以在EmailAlert類上使用屬性 查看此答案 ,您將如何做到這一點。

public static class EMailAlerts
{
    static XmlSerializer   XML = new XmlSerializer(typeof(List<EMailAlert>));

    public static List<EMailAlert> Alerts { get; private set; }

    public static void Save(string fileName)
    {
        using (var stream = new FileStream(fileName, FileMode.Create))
        {
            XML.Serialize(stream, Alerts);
        }
    }

    public static void LoadFromFile(string fileName)
    {
        if (!File.Exists(fileName))
        {
            Alerts = new List<EMailAlert>();
        }
        else
        {
            using (var stream = new FileStream(fileName, FileMode.Open))
            {
                Alerts = (List<EMailAlert>)XML.Deserialize(stream);
            }
        }
    }
}

public class EMailAlert
{
    public string h1 { get; set; }
    public string body { get; set; }
    public string idList { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        EMailAlerts.LoadFromFile("tmp.xml");

        EMailAlerts.Alerts.Add(new EMailAlert{ body="foo"});
        EMailAlerts.Save("tmp.xml"); 
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM