2013-07-19 2 views
0

Я использую BinaryFormatter для загрузки & Сохраните мое treeView. Я хочу предотвратить ошибки, если файл назначения не существует. Мой код:BinaryFormatter: SerializationException

 public static void Load(TreeView tree, string filename) 
    { 
     if (!File.Exists(filename)) 
     { 
      Stream file = File.Create(filename); 
      return; 
     } 
     else 
     { 

      using (Stream file = File.Open(filename, FileMode.Open)) 
      { 
       BinaryFormatter bf = new BinaryFormatter(); 
       object obj = bf.Deserialize(file); 

       TreeNode[] nodeList = (obj as IEnumerable<TreeNode>).ToArray(); 
       tree.Nodes.AddRange(nodeList); 
      } 
     } 
    } 

Если я вручную удалю файл, он должен создать новый файл, называемый так же, как и предыдущий. Проблема в том, что когда он достигает object obj = bf.Deserialize(file);, появляется ошибка Attempting to deserialize an empty stream.. Я предполагаю, что в новом файле отсутствуют некоторые бинарные структуры или что-то в этом роде, но я не уверен, как его решить. И если я попытаюсь добавить узел в treeView и сохранить его позже, я получаю ошибку, этот файл используется другой программой.

ответ

2
public static void Load(TreeView tree, string filename) 
{ 
    using (var file = File.Open(filename, FileMode.OpenOrCreate)) 
    { 
     if (file.Length.Equals(0)) 
      return; 

     var bf = new BinaryFormatter(); 
     var obj = bf.Deserialize(file); 
     var nodeList = (obj as IEnumerable<TreeNode>).ToArray(); 
     tree.Nodes.AddRange(nodeList); 
    } 

} 
+0

Спасибо, работает как шарм. Есть еще одна вещь, которую я напишу, если кто-то ищет ответ в будущем: после создания нового файла вы должны закрыть его, иначе вы не сможете загрузить его до перезапуска приложения. Просто добавьте «file.Close();» перед «возвратом»; – PotatoBox

+0

'FileMode.OpenOrCreate' не должен работать для этого. –

+1

И блок 'using() {}' выполняет 'Close()'. –