使用二进制格式化程序序列化/反序列化对象列表

本文关键字:反序列化 对象 列表 序列化 程序 二进制 格式化 | 更新日期: 2023-09-27 18:26:33

我知道已经有很多关于这个话题的讨论,比如这个:

二进制格式化程序和反序列化复杂对象

但这看起来非常复杂。我正在寻找一种更简单的方法,将通用对象列表序列化和反序列化为一个文件/从文件反序列化。这是我尝试过的:

    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。有谁知道如何将字典和树节点拉出并将它们扔回去,可能采用不同的方法,但也很好,很简单?谢谢!

使用二进制格式化程序序列化/反序列化对象列表

您已经序列化了一个对象列表,其中第一项是节点列表,第二项是字典。因此,在反序列化时,您将返回相同的对象。

反序列化的结果将是一个List<object>,其中第一个元素是List<TreeNode>,第二个元素是Dictionary<int, Tuple<List<string>, List<string>>>

像这样:

public static void LoadFile(string fileName)
{
    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
    }
}

你可以试试这个小提琴。