如何序列化通用列表?

时间:2015-12-23 19:44:58

标签: c# generics serialization filestream generic-list

我有employeessupervisors

的通用列表
List<Employee> employees = new List<Employee>();
List<Supervisor> supervisors = new List<Supervisor>(); 

它们都是我标记为employee

[Serializable]类的一部分

我可以将这两个列表放到另一个列表中,以便更容易序列化吗?

我查看了序列化教程,但他们只指定了一个或更少的通用列表。

我提供了一个模板,我想点击“保存”。按钮并完成序列化过程,最好将两个列表放在一个更大的列表中。

private void btnSave_Click(object sender, EventArgs e)
{
     FileStream outFile;
     BinaryFormatter bFormatter = new BinaryFormatter();
}

2 个答案:

答案 0 :(得分:1)

您实际上可以将两个列表序列化为一个流:

using (FileStream fs = new FileStream(..., FileMode.OpenOrCreate)) {
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(fs, employees);
    bf.Serialize(fs, supervisors);
}

BinaryFormatter在数据块前面加上元数据,这显然也允许它将数据连接到一个文件。为了回读supervisors,您必须先加载其他列表。由于列表不是固定长度记录,因此当您重写第一个列表时,第二个列表可能会变得无法使用,并且会将其丢失在孤立数据之后或覆盖其中的一部分。

由于有很多东西可以阻止它工作,因此很容易创建一个&#34;持有者&#34;或者倍数的容器类:

[Serializable()]
public class BFHolder
{
    public List<Employee> employees { get; set; }
    public List<Supervisor> supervisors { get; set; }   
    public BFHolder()
    {
    }
}

反序列化后,您可以根据需要提取列表。

还有一个 - 更好 - 选项是ProtoBuf-Net(向下滚动到阅读我)。除了比BinaryFormatter更快并创建更小的输出之外,它还包括将多个对象序列化为一个流的方法。

using (FileStream fs = new FileStream(..., FileMode.OpenOrCreate)) {
    Serializer.SerializeWithLengthPrefix<List<Employee>>(fs, employees,
                    PrefixStyle.Base128);
    Serializer.SerializeWithLengthPrefix<List<Supervisor>>(fs, supervisors,
                    PrefixStyle.Base128);
}

答案 1 :(得分:0)

您可以将此列表放在另一个类容器中并对其进行序列化/反序列化。

[Serializable]
public class Container 
{
     public List<Employee> employees = new List<Employee>();
     public List<Supervisor> supervisors = new List<Supervisor>();
}