2015-11-10 1 views
2

Проблема заключается в том, что я получаю нулевой отсчет в репо, когда десериализации его (без каких-либо ошибок)Deserializtion возвращают пустой объект, используя FileStream и Binary Formatter

[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\[email protected]]+\.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 не пусто и Я вижу некоторые записи в нем. Пожалуйста, помогите мне

+0

Я предполагаю, что у вас возникла эта проблема, потому что класс словаря, который вы получили, не помечен как сериализуемый. В этом случае я думаю, что вам нужен суррогат. Это может быть ваш [ответ] (http://stackoverflow.com/questions/13166105/is-it-possible-to-do-net-binary-serialization-of-an-object-when-you-dont-have) , Вопрос в том, действительно ли вам нужно вывести свой класс из класса Dictionary? –

+0

@KosalaW - 'Словарь ' сериализуем. См. [Источник ссылки] (http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs). – dbc

+0

@KosalaW это будет легко для меня, если я не использую производный класс? любезно проверьте ответ dbc. он говорит, что мне не нужно имя файла. Как? – Charlie

ответ

2

Вы должны вызвать базовый конструктор из вашего потокового конструктора:

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

Кроме того, FileName, вероятно, не должно быть поле, вы выделения памяти для него в классе, который не является необходимо. Вместо того, чтобы статическое свойство, казалось бы больше смысла:

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

да это работает, спасибо много :) – Charlie

2

Когда базовый класс реализует ISerializable, не достаточно просто хлопнуть [Serializable] атрибут производного класса. Ваш производный класс должен:

  1. База вызовов (информация, контекст) из (в настоящее время пуста) конструктора сериализации.
  2. Заполните свой конструктор сериализации, чтобы прочитать любые значения экземпляра из SerializationInfo.
  3. Создайте переопределение GetObjectData(SerializationInfo info, StreamingContext context), чтобы записать производные члены в SerializationInfo (и вызвать реализацию базового класса).

Выполнение анализа кода VS на вашем классе осветит проблемы.

Смежные вопросы