XmlSerializer/Deserialize 在 C# 中

XmlSerializer/Deserialize in C#

我创建了这个 class,它将附加到名为电子邮件提醒 h1、正文和 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。

您需要将所有 EMailAlert 序列化为有效的集合类型 xml。

下面的代码就是这样做的。通过创建一个静态助手 class 来保存我们所有 EmailAlert 的静态列表。它还具有读取和写入文件的加载和保存方法,并使用 属性 警报获取或存储电子邮件警报。

您可以使用 attributes on your EmailAlert class if you want to control serialization. See 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"); 
    }
}