XML反序列化错误

时间:2013-12-13 15:18:13

标签: c# xml deserialization

我目前正在使用xml文件,该文件通常应包含自定义对象列表(List),但有时可以只包含带有消息的字符串节点。我有一个反序列化此文件的代码:

private T DeserializeFile<T>(string filePath)
    {
        StreamReader readFileStream = new StreamReader(@filePath);
        var serializerObj = new XmlSerializer(typeof(T));

        return (T)serializerObj.Deserialize(readFileStream); 
    }

这适用于List但是对于简单的字符串抛出错误(InvalidOperationException - 缺少Root元素,或者“不期望”。)。当文件只包含字符串元素并从函数返回null时,如何检测大小写?

基本上这就是我想要做的事情:

private T DeserializeFile<T>(string filePath)
    {
        StreamReader readFileStream = new StreamReader(@filePath);
        var serializerObj = new XmlSerializer(typeof(T));

        try
        {
            return (T)serializerObj.Deserialize(readFileStream); 
        }
        catch (Exception ex)
        {
            return null;
        }            
    }

1 个答案:

答案 0 :(得分:0)

这应该做你想做的事。它使用XDocument来加载和解析文件,以便在尝试反序列化之前检查是否有任何元素。

private T DeserializeFile<T>(string filePath)
{
    var xdoc = XDocument.Load(filePath);
    if (xdoc.Root.Elements().Any())
    {
        var serializerObj = new XmlSerializer(typeof(T));
        return (T)serializerObj.Deserialize(xdoc.CreateReader());
    }
    else
        return default(T);
}

这假设您始终拥有有效的XML文件,唯一的区别在于根目录是包含更多元素还是仅包含文本,例如像

这样的清单
<someRoot>
  <someObj>
  </someObj>
  <someObj>
  </someObj>
</someRoot>

这样的“字符串”
<someRoot>just a string</someRoot>