2014-10-15 4 views
2

Я знаю, что было уже много дискуссий на эту тему, как этот:сериализации/десериализации список объектов с помощью BinaryFormatter

BinaryFormatter and Deserialization Complex objects

, но это выглядит очень сложным. Я ищу более простой способ сериализации и десериализации общего списка объектов в/из одного файла. Это то, что я пробовал:

public void SaveFile(string fileName) 
    { 
     List<object> objects = new List<object>(); 

     // Add all tree nodes 
     objects.Add(treeView.Nodes.Cast<TreeNode>().ToList()); 

     // Add dictionary (Type: Dictionary<int, Tuple<List<string>, List<string>>>) 
     objects.Add(dictionary); 

     using(Stream file = File.Open(fileName, FileMode.Create)) 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(file, objects); 
     } 
    } 

    public void LoadFile(string fileName) 
    { 
     ClearAll(); 
     using(Stream file = File.Open(fileName, FileMode.Open)) 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 

      object obj = bf.Deserialize(file); 

      // Error: ArgumentNullException in System.Core.dll 
      TreeNode[] nodeList = (obj as IEnumerable<TreeNode>).ToArray(); 

      treeView.Nodes.AddRange(nodeList); 

      dictionary = obj as Dictionary<int, Tuple<List<string>, List<string>>>; 

     } 
    } 

сериализация работает, но десериализация завершается с ArgumentNullException. Кто-нибудь знает, как вытащить словарь и узлы дерева и отбросить их обратно, может быть с другим подходом, но также приятным и простым? Благодаря!

+0

is 'obj' не null? – Reniuz

+0

Да, кажется, что «obj» действительно был нулевым, но в моем чертовом взгляде это не так. : -S – betaFlux

ответ

1

Вы сериализовали список объектов, где первый элемент представляет собой список узлов, а второй - словарь. Поэтому при десериализации вы получите те же объекты обратно.

Результат от десериализации будет List<object>, где первый элемент является List<TreeNode> и второй элемент а Dictionary<int, Tuple<List<string>, List<string>>>

Что-то вроде этого:

public static void LoadFile(byte[] bytes) 
{ 
    ClearAll(); 
    using(Stream file = File.Open(fileName, FileMode.Open)) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 

     object obj = bf.Deserialize(file); 

     var objects = obj as List<object>; 
     //you may want to run some checks (objects is not null and contains 2 elements for example) 
     var nodes = objects[0] as List<TreeNode>; 
     var dictionary = objects[1] as Dictionary<int, Tuple<List<string>,List<string>>>; 

     //use nodes and dictionary 
    } 
} 

Вы можете дать ему попробовать on this fiddle.

+1

Удивительно, теперь он работает безупречно. Кажется, я должен получить некоторые знания о том, как работают форматиры. Спасибо за доработку! Кстати: Отличный инструмент! – betaFlux

+0

Рад помочь! (Мне очень нравится dotnetfiddle) –

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