XmlSerializer.Serialize不保存文件,也不抛出异常

时间:2010-04-10 18:21:52

标签: c# xml-serialization filestream

我在保存对象时遇到问题。看看这段代码:

public void SerializeToXML(String FileName)
{
    XmlSerializer fSerializer = new XmlSerializer(typeof(Configuration));
    using (Stream fStream = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        fSerializer.Serialize(fStream, this);
    }
}

问题是,当用户没有权限访问硬盘上的位置时,此函数不会抛出任何异常,也不会保存我的文件。例如,保存到“C:\ test.xml”就像没有发生任何事情一样。我想知道文件是否未保存,最好知道原因。

我知道我可以检查给定位置上的文件是否存在并且手动抛出异常但不应该由XmlSerializer或FileStream本身完成吗?

感谢您的时间

修改

因为我怀疑我必须打开一些额外的调试。由于我使用的是using子句,因此必须在Debug部分的“项目属性”中检查“启用非托管代码调试选项”。在此之后,调试过程中会显示异常。

EDIT2

使用此代码替换上述using子句会触发异常:

public void SerializeToXML(String FileName)
{
    XmlSerializer fSerializer = new XmlSerializer(typeof(Configuration));
    Stream fStream = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None);
    try
    {
        fSerializer.Serialize(fStream, this);
    }
    finally
    {
        fStream.Close();
    }
}

3 个答案:

答案 0 :(得分:1)

这对我来说听起来很奇怪 - 听起来它与序列化器没什么关系。如果您没有对特定位置的访问权限,那么创建FileStream应该抛出异常;它不应该等到Serialize行。

你是否绝对确定你没有更高的阻挡块,这会隐藏你的问题?

答案 1 :(得分:1)

我怀疑它与你的using语句有关,因为它使用了一个隐藏的try-finally结构(在finally子句中调用了Dispose()方法)。有关using块外无法看到的例外情况的信息可以在here找到。

尝试用实例化替换using语句并调用它的Dispose()方法,我认为你的问题已经解决了。当然,您应该将代码放在一个明确的try-finally结构中,作为良好编程实践的一部分。

答案 2 :(得分:1)

Vista文件重定向可以解释这一点。该功能允许不能正确处理UAC的旧程序仍然可以运行。该文件被重定向到虚拟商店。

当您使用Visual Studio 2005或更早版本或执行某些操作以防止清单嵌入到exe中时,会发生这种情况。按including a manifest修正。