0

我使用以下代码序列化 xml 文件。

我想知道CanDeserialize在这种情况下是否应该使用该功能。

我注意到如果文件为空,就会CanDeserialize抛出异常。XmlException

Deserialize在这种情况下抛出InvalidOperationException

我的问题是我是否应该删除那个额外的检查,如果Deserialize做某种检查呢?

编辑:阅读一些评论和答案后,我想知道何时使用CanDeserialize

public static T RestoreFromXml(string filename)
{
    Object res = null;
    using (var stream = new FileStream(filename, FileMode.Open))
    {
        XmlReader reader = new XmlTextReader(stream);
        try
        {
            if (xs.CanDeserialize(reader))
            {
                res = xs.Deserialize(reader);
            }
        }
        catch (XmlException ex)
        {
            throw ex;
        }            
    }
    return (T)res;
}
4

2 回答 2

1

您可以在尝试反序列化之前进行一些检查 - 检查文件名是否为空或空,检查文件是否存在等。这是一些反序列化文件的代码:

/// <summary>
/// XML serializer helper class. Serializes and deserializes objects from/to XML
/// </summary>
/// <typeparam name="T">The type of the object to serialize/deserialize.
/// Must have a parameterless constructor and implement <see cref="Serializable"/></typeparam>
public class XmlSerializer<T> where T: class, new()
{
    /// <summary>
    /// Deserializes a XML file.
    /// </summary>
    /// <param name="filename">The filename of the XML file to deserialize</param>
    /// <returns>An object of type <c>T</c></returns>
    public static T DeserializeFromFile(string filename)
    {
        return DeserializeFromFile(filename, new XmlReaderSettings());
    }

    /// <summary>
    /// Deserializes a XML file.
    /// </summary>
    /// <param name="filename">The filename of the XML file to deserialize</param>
    /// <param name="settings">XML serialization settings. <see cref="System.Xml.XmlReaderSettings"/></param>
    /// <returns>An object of type <c>T</c></returns>
    public static T DeserializeFromFile(string filename, XmlReaderSettings settings)
    {
        if (string.IsNullOrEmpty(filename))
            throw new ArgumentException("filename", "XML filename cannot be null or empty");

        if (! File.Exists(filename))
            throw new FileNotFoundException("Cannot find XML file to deserialize", filename);

        // Create the stream writer with the specified encoding
        using (XmlReader reader = XmlReader.Create(filename, settings))
        {
            System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
            return (T) xmlSerializer.Deserialize(reader);
        }
    }
} 

}

你可以像这样使用它:

string filename = "...";

Foo foo = XmlSerializer<Foo>.DeserializeFromFile(filename);

这段代码取自我写的一篇文章,你可以在这里找到它:

使用泛型的 XML 序列化

于 2012-12-18T08:41:36.917 回答
1

我建议您使用 CanDeserialize 只是为了尽可能少地抛出异常。当应用程序处于您无法保护自己的异常状态时,应该例外。

你可以对守卫说同样的话。为什么要检查:

if (value == null)
    return;
//do something

代替:

try{
   // do something
catch()

这不是完全相同的事情,但我认为让您的应用程序尽可能不受异常影响的一般想法是一个好主意。

于 2012-12-18T08:45:54.057 回答