Deserializtion使用Filestream和Binary Formatter返回空对象

时间:2015-11-10 05:45:17

标签: c# filestream binaryformatter

问题是,在反序列化时,我在repo中得到零计数(没有任何错误)

[Serializable]
class RegexRepository : Dictionary<string, string>
{
    public RegexRepository()
    {
        //this.Add("All", "ALL");
        //this.Add("Name", @"Name:(?<data>[\s\w]+)Email");
        //this.Add("Email", @"Email:(?<data>[\w\s@]+\.com)");
        //this.Add("Phone Number", "Phone:(?<data>\\d+)");
    }
    protected RegexRepository(SerializationInfo info, StreamingContext context)
    {

    }
    private static RegexRepository repo = new RegexRepository();
    public static RegexRepository Instance
    {
        get
        {
            if (repo == null)
            {
                repo = new RegexRepository();
            }
            return repo;
        }
    }
    string FileName = AppDomain.CurrentDomain.BaseDirectory + "BinaryFile.dat";
    public void Serialize()
    {
        using (FileStream ms = new FileStream(FileName, FileMode.OpenOrCreate))
        {
            var bf = new BinaryFormatter();
            bf.Serialize(ms, this);
        }
    }
    public void Deserialize()
    {
        if (System.IO.File.Exists(FileName))
        {
            using (FileStream ms = new FileStream(FileName, FileMode.Open))
            {
                var bf = new BinaryFormatter();
                repo = (RegexRepository)bf.Deserialize(ms);
               //Here i get zero count in repo, checked while debugging
            }
        }
    }
}

我看到 BinaryFile.dat 不是空的,我可以在其中看到一些记录。请帮助我

2 个答案:

答案 0 :(得分:2)

您需要从流构造函数中调用基础构造函数:

    protected RegexRepository(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }

此外,FileName可能不应该是一个字段,您在课堂上为它分配内存,这是不必要的。相反,静态属性似乎更有意义:

    static string FileName
    {
        get
        {
            return AppDomain.CurrentDomain.BaseDirectory + "BinaryFile.dat";
        }
    }

答案 1 :(得分:2)

当基类实现ISerializable时,它不足以在派生类上打一个[Serializable]属性。您的派生类需要:

  1. 从(当前为空)序列化构造函数调用base(info,context)。
  2. 填写序列化构造函数以从SerializationInfo中读取任何实例值。
  3. 创建GetObjectData(SerializationInfo info, StreamingContext context)覆盖以将派生成员写入SerializationInfo(并调用基类&#39;实现)。
  4. 在课堂上运行VS代码分析会解决问题。