【问题标题】:XmlSerializer/Deserialize in C#C# 中的 XmlSerializer/反序列化
【发布时间】:2015-06-22 14:29:38
【问题描述】:

我创建了这个类,它将附加到名为 Email Alerts h1、body 和 ids 的 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 != EmailAlert。听起来您想序列化警报列表,这与您编写的内容不接近。
  • 是的,你是对的,我需要一个序列化列表。我该怎么办。抱歉,我是新手
  • 添加一个名为 EmailAlerts 的类,这样您就可以实际存储一组警报,这将是最明显的下一步。
  • 好的,我创建了另一个名为 EmailAlerts 的类 .. 使用类类型为 EmailAlert 的 getter 和 setter,但我怎样才能将它们加载到 XML 中并从中读取呢?

标签: c# xml-serialization xml-deserialization


【解决方案1】:

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

下面的代码就是这样做的。通过创建一个静态助手类来保存我们所有的 EmailAlerts 的静态列表。它还具有读取和写入文件并使用属性 Alerts 获取或存储 EmailAlerts 的 Load 和 Save 方法。

如果你想控制序列化,你可以在你的 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"); 
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多