传入/传出 XML 的对象:通用加载和保存

本文关键字:加载 保存 对象 传出 XML 传入 | 更新日期: 2023-09-27 18:30:21

我需要将一些对象存储为XML文件,以便保存数据并在以后加载。我对此进行了编码,它对我有用:

public static Project Load(String file)
{
    using (var stream = System.IO.File.OpenRead(file))
    {
        var serializer = new XmlSerializer(typeof(Project));
        return serializer.Deserialize(stream) as Project;
    }
}
public static void Save(Project p, String file)
{
    using (var writer = new System.IO.StreamWriter(file))
    {
        var serializer = new XmlSerializer(p.GetType());
        serializer.Serialize(writer, p);
        writer.Flush();
    }
}

现在,我需要对其他类型的对象执行此操作,并且我真的不想为每个对象类复制/粘贴这些方法。

是否可以将对象类传递给方法并使这些方法适用于任何对象类?

传入/传出 XML 的对象:通用加载和保存

我通常从 https://stackoverflow.com/a/271423/1315444 开始使用这两种方法希望这对:D有所帮助

/// <summary>Serializes an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="obj">Object to serialize</param>
/// <returns>A string that represents Xml, empty otherwise</returns>
public static string XmlSerialize<T>(this T obj) where T : class, new()
{
    if (obj == null) throw new ArgumentNullException("obj");      
    var serializer = new XmlSerializer(typeof(T));
    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, obj);
        return writer.ToString();
    }
}

/// <summary>Deserializes an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialize from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialize<T>(this string xml) where T : class, new()
{
    if (xml == null) throw new ArgumentNullException("xml");    
    var serializer = new XmlSerializer(typeof(T));
    using (var reader = new StringReader(xml))
    {
        try { return (T)serializer.Deserialize(reader); }
        catch { return null; } // Could not be deserialized to this type.
    }
}

然后你可以去

Project p = new Project();
string result = p.XmlSerialize();
Project p2 = result.XmlDeserialize<Project>();