XmlSerializer是否会创建空文档

时间:2010-12-07 18:49:43

标签: c# xmlserializer

好的,以下代码我已经生产了一年多没有变化。它一直运作良好。在过去一个月内,少数机器报告xml文档完全为空。它们甚至不包含xml标头。我无法复制突然变空的文件,也无法建议它发生的方式。我希望有人有类似的问题,他们解决了。

使用此代码的大多数机器已经使用了大约一年,如果不是更多的话。用于在其中包含数据和列表的空文件。文件不会同时序列化。在程序退出之前,一个接一个地保存/序列化。

我的问题: 下面的代码是否可以创建一个空文件? 还有什么会导致他们突然变空? 有没有其他人在过去一个月中遇到过XML-serializer的问题? (这个问题仅发生在过去一个月中已稳定3个月以上的版本。)

如果您有疑问或我遗失了什么请问。还有各种各样的类型,我序列化...所以如果你能想象它我可能有类似的东西被序列化。

 public class BackEnd<T> {
 public string FileSaveLocation = "this gets set on startup";
 public bool DisabledSerial;
 public virtual void BeforeDeserialize() { }
 public virtual void BeforeSerialize() { }
 public virtual void OnSuccessfulSerialize() { }
 protected virtual void OnSuccessfulDeserialize(ListBackEnd<T> tmpList) { }
 protected virtual void OnDeserialize(ListBackEnd<T> tmpList) { }

 public virtual void serialize()
    {
        if (DisabledSerial)
            return;
        try
        {
            BeforeSerialize();

            using (TextWriter textWrite = new StreamWriter(FileSaveLocation))
            {
                (new XmlSerializer(this.GetType())).Serialize(textWrite, this);
                Debug.WriteLine(" [S]");
                textWrite.Close();
            }
            OnSuccessfulSerialize();
        }
        catch (Exception e)
        {
            Static.Backup.XmlFile(FileSaveLocation);
            Log.ErrorCatch(e,
                "xml",
                "serialize - " + typeof(T) + " - " + (new FileInfo(FileSaveLocation)).Name);
        }

    }

    public virtual object deserialize(TextReader reader)
    {
        if (this.DisabledSerial)
            return false;


        ListBackEnd<T> tmp = null;


        this.BeforeDeserialize();

        if (reader == null && !File.Exists(this.FileSaveLocation))
        {
            Log.Write(Family.Error,
                "xml",
                "deserialize - " + this.GetType() + " - file not found. " + (new FileInfo(FileSaveLocation)).Name);
        }
        else
        {
            try
            {
                using (TextReader textRead = ((reader == null) ? new StreamReader(this.FileSaveLocation) : reader))
                {
                    tmp = (ListBackEnd<T>)this.get_serializer().Deserialize(textRead);
                    Debug.WriteLine(" [D]");
                    textRead.Close();
                }
                OnSuccessfulDeserialize(tmp);

                if (tmp != null)
                {
                    this._Items = tmp._Items;
                    this.AutoIncrementSeed = tmp.AutoIncrementSeed;
                    if (this._Items.Count > this.AutoIncrementSeed && this._Items[0] is ItemStorage)
                        this.AutoIncrementSeed = this._Items.Max(item => (item as ItemStorage).Key);
                }
            }
            catch (Exception e)
            {
                // this only copies the file
                Static.Backup.XmlFile(FileSaveLocation);
                // this only logs the exception
                Log.ErrorCatch(e,
                    "xml",
                    "deserialize - " + typeof(T) + " - " + (new FileInfo(FileSaveLocation)).Name);
            }
        }
        //{ Log.ErrorCatch(e, "xml", "deserialize" + this.GetType() + " - " + this.FileSaveLocation); }

        OnDeserialize(tmp);

        tmp = null;

        return (_Items.Count > 0);
    }
}

2 个答案:

答案 0 :(得分:7)

我们在$ WORK遇到过这个问题几次,症状是一个大小正确的空文件但填充零字节。

我们找到的解决方案是在FileStream上设置WriteThrough值:

using (Stream file = new FileStream(settingTemp, FileMode.Create,
                                   FileAccess.Write, FileShare.None,
                                   0x1000, FileOptions.WriteThrough))
{
   using (StreamWriter sw = new StreamWriter(file))
   {
      ...
   }
}

答案 1 :(得分:3)

我认为会发生这种情况的唯一原因是这一行:

(new XmlSerializer(this.GetType())).Serialize(textWrite, this);

抛出异常并创建和处理文本编写器,而不会写入任何内容。我会查看你的日志中的错误。

什么是

Static.Backup.XmlFile(FileSaveLocation);

办?