C# 使用XmlSerializer时丢失XML文件

C# 使用XmlSerializer时丢失XML文件,c#,xmlserializer,C#,Xmlserializer,有时,当我保存到XML时,最终会得到一个完全空的XML文件 我还不能按要求复制这个问题。这只是偶然的。在这方面是否可以采取措施帮助用户 目前,我这样做: public bool SavePublisherData() { bool bSaved = false; try { XmlSerializer x = new XmlSerializer(_PublisherData.GetType()); using (StreamWriter

有时,当我保存到XML时,最终会得到一个完全空的XML文件

我还不能按要求复制这个问题。这只是偶然的。在这方面是否可以采取措施帮助用户

目前,我这样做:

public bool SavePublisherData()
{
    bool bSaved = false;

    try
    {
        XmlSerializer x = new XmlSerializer(_PublisherData.GetType());
        using (StreamWriter writer = new StreamWriter(_strPathXML))
        {
            _PublisherData.BuildPublisherListFromDictionary();
            x.Serialize(writer, _PublisherData);

            bSaved = true;
        }
    }
    catch
    {

    }

    return bSaved;
}
我没有在catch块中放入任何内容的原因是,这段代码是C#DLL的一部分,我从MFC项目调用它。我已经读到,您不能(或不应该)将异常从一个环境传递到另一个环境。因此,当我的DLL中发生异常时,我真的不知道如何合理地将该信息提供给用户,以便他们能够看到它。这是一个次要问题

但我就是这样保存它的。那么,我们可以采取哪些步骤来尝试并防止完全的数据丢失呢

多谢各位

更新 我已经查看了评论中的链接所指的内容,其中指出:

使用以下XmlSerializer类构造函数。这些类构造函数缓存程序集

这一点也在注释中重新说明:

解决办法是什么

默认构造函数XmlSerializer(类型)和XmlSerializer(类型,defaultNameSpace)缓存动态程序集,因此如果使用这些构造函数,则只需要创建动态程序集的一个副本

看起来很聪明…为什么不在所有构造函数中都这样做呢?嗯……有趣的想法,想知道他们为什么没有想到这个:)好吧,其他构造函数用于特殊情况,假设你不会使用这些特殊情况创建大量相同的XmlSerializer,这意味着我们会缓存很多我们后来不需要的项,并占用大量额外空间。有时你必须做对大多数人有利的事

那么,如果需要使用其他构造函数中的一个,您会怎么做?我的建议是,如果需要经常使用XmlSerializer,可以缓存它。那么它只会被创建一次

如您所见,我的代码使用以下默认构造函数之一:

XmlSerializer(_PublisherData.GetType());
        

因此,在本例中,我不必担心这个
XmlSerializerFactory

是否有可能在同一个文件上有多个线程调用SavePublisherData?@Gusman我会拒绝这个问题。我正在运行我的应用程序的一个实例,该接口位于通过app类可用的包装器中。我只调用了一次这个方法。所以我看不出它被多次调用。@AndrewTruckle你到底在序列化什么?它不同吗?您是否尝试过锁定XML文件?@PaulZahra如何锁定XML文件?@AndrewTruckle我想这取决于您在单个应用程序实例中如何使用XmlSerializer。。。在单例中使用XmlSerializerFactory的另一个好处是防止XmlSerializer(按设计)内存泄漏,当然还要确保正确处理互斥(以及任何异常)。。。有时,循环所有进程完整路径以确保另一个实例未运行更容易/更好。。。然后还有比赛条件要考虑…尤赫。