0

次のコードを使用して、xml ファイルをシリアル化します。

CanDeserializeこの場合、関数を使用する必要があるかどうか疑問に思います。

ファイルが空の場合にCanDeserializeスローされることに気付きました。XmlException

DeserializeInvalidOperationExceptionその場合はスローします。

私の質問は、その余分なチェックを削除する必要があり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

CanDeserialize を使用して、例外をできるだけ少なくスローすることをお勧めします。例外は、アプリケーションが自分自身を保護できない異常な状態にある場合です。

警備員についても同じことが言えます。チェックする理由:

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

それ以外の:

try{
   // do something
catch()

まったく同じというわけではありませんが、管理できる限りアプリケーションを例外から解放するという一般的な考え方は良い考えだと思います。

于 2012-12-18T08:45:54.057 に答える
1

逆シリアル化を試みる前に、いくつかのチェックを行うことができます。ファイル名が null または空でないかどうか、ファイルが存在するかどうかなどを確認します。ファイルを逆シリアル化するコードを次に示します。

/// <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);

このコードは、私が書いた記事から引用したものです。ここで見つけることができます。

Generics を使用した XML シリアライゼーション

于 2012-12-18T08:41:36.917 に答える