2015-06-22 48 views
0

我創建了這個類,它將追加到名爲Email Alerts h1,body和id的XML。然而,即時通訊從一開始運行這個文件(當我調用LoadFromFile時),當文件不存在 - 所以我們將不得不創建一個文件並開始記錄它。XmlSerializer/Deserialize in C#

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時它沒有發送空電子郵件警告

+0

EmailAlerts!= EmailAlert。聽起來你想要序列化一系列警報,這與你寫的內容並不相近。 –

+0

是的你是對的我需要一個序列化列表。我怎麼去解決這個問題。對不起,我是新手 – lynx

+0

添加一個名爲EmailAlerts的類,這樣你實際上可以存儲一系列警報,這將是最明顯的下一步。 –

回答

3

你需要一個你的所有EMailAlerts的集合類型被序列化爲有效的xml。

以下代碼執行此操作。通過創建一個靜態助手類來保存我們所有EmailAlerts的靜態列表。它還具有讀取和寫入文件的Load和Save方法,並使用屬性Alerts獲取或存儲EmailAlerts。

如果您想要控制序列化,您可以在EmailAlert類上使用attributes。請參閱this answer你如何做到這一點。

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"); 
    } 
} 
+3

這是我愛你!非常感謝Rene! – lynx