Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML反序列化错误_C#_Xml_Deserialization - Fatal编程技术网

C# XML反序列化错误

C# XML反序列化错误,c#,xml,deserialization,C#,Xml,Deserialization,我目前正在处理一个xml文件,该文件通常应该包含一个自定义对象列表(list),但有时可能只包含一个带有消息的字符串节点。我有一个反序列化此文件的代码: private T DeserializeFile<T>(string filePath) { StreamReader readFileStream = new StreamReader(@filePath); var serializerObj = new XmlSerializer(ty

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

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

        return (T)serializerObj.Deserialize(readFileStream); 
    }
private T反序列化文件(字符串文件路径)
{
StreamReader readFileStream=新的StreamReader(@filePath);
var serializerObj=新的XmlSerializer(typeof(T));
返回(T)serializerObj.Deserialize(readFileStream);
}
这适用于列表,但对于简单字符串会抛出错误(InvalidOperationException-缺少根元素,或“未预期”)。当文件仅包含string元素并从函数返回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;
        }            
    }
private T反序列化文件(字符串文件路径)
{
StreamReader readFileStream=新的StreamReader(@filePath);
var serializerObj=新的XmlSerializer(typeof(T));
尝试
{
返回(T)serializerObj.Deserialize(readFileStream);
}
捕获(例外情况除外)
{
返回null;
}            
}

这应该可以完成您想要做的事情。它使用来加载和解析文件,以便在尝试反序列化之前检查是否存在任何元素

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);
}
private T反序列化文件(字符串文件路径)
{
var xdoc=XDocument.Load(文件路径);
if(xdoc.Root.Elements().Any())
{
var serializerObj=新的XmlSerializer(typeof(T));
返回(T)serializerObj.Deserialize(xdoc.CreateReader());
}
其他的
返回默认值(T);
}
这假设您始终拥有有效的XML文件,唯一的区别是根目录包含更多的元素还是仅包含文本,例如类似

<someRoot>
  <someObj>
  </someObj>
  <someObj>
  </someObj>
</someRoot>

还有一条“线”像

只是一个字符串

在将文件内容发送到
XmlDeserialize()
之前,您不能简单地检查XML的文件内容吗?如何检查内容?您已经有了
StreamReader
对象。只需使用它的
ReadToEnd()
将整个文件内容放在一个字符串中,然后使用简单的字符串函数或正则表达式检查xml节点。这是一个通用的方法,我不想在其中插入特殊的案例。这实际上不起作用。我调用的方法如下:列表结构=反序列化文件(_reportPath);在这里,如果xml文件包含一个简单的字符串节点,而不是CustomObjective类型的更复杂的节点,那么我想得到一个空值或空列表。它确实返回了
null
,并带有我得到的测试数据(当
T
类时,
default(T)
)。我张贴了这样的例子;您的数据是否有其他与我的代码不兼容的格式?
<someRoot>just a string</someRoot>