【问题标题】:Serialiazing various types into one file将各种类型序列化到一个文件中
【发布时间】:2010-08-15 09:56:34
【问题描述】:
我正在使用BinaryFormatter 来序列化我的对象。我在他们的相关列表中有各种对象类型。是否有一种“最佳”方法可以将所有对象序列化到一个文件中,但能够在反序列化时将它们分开?目前,我正在反序列化整个文件并检查每个对象中的特定字段,以查看在反序列化后我应该将它们重新添加到哪个列表中。例如,我所有的福特汽车都有“福特”字段,丰田有“丰田”等。在反序列化时,我“遍历”对象,检查他们的“公司”字段,然后将它们分配给List<Company>。
我不确定这是否是最有效的做事方式。有什么建议么?
感谢您的帮助
【问题讨论】:
标签:
c#
serialization
binaryformatter
【解决方案1】:
这很简单……而不是对每个单独的项目进行序列化。只需创建一个“父”类,它对每个项目类型都有一个属性。然后你可以序列化那个对象。当你在另一端反序列化它时,它已经为你完全整理好了。
【解决方案2】:
您可以更有效地执行此操作的唯一方法是将它们序列化到不同的文件中(基于对您的域有意义的字段标准)。因为您不能保证它们将按特定顺序序列化到文件中,所以无论如何反序列化时都必须将整个文件读入内存以查找字段值就是您的类型的所有实例正在寻找。
我认为您已经在序列化到文件的限制范围内尽了最大努力。您是否认为 SQLite 是您的存储机制?
【解决方案3】:
你在做什么听起来像一本字典 (Dictionary<string, List<Company>>)。不过,请在您的问题中提供一些源代码。
没有序列化字典的内置方法,但您可以创建自己的自定义类。我会把它作为练习留给你去谷歌搜索:)
如果您想继续以相同的方式序列化,但由对象内部的已知成员分隔(并且该成员始终相同),您可以使用 LINQ 查询以短代码提取对象:
IEnumerable<Company> companiesFromFile = GetDeserializedFile();
var dictionaryFromFile = companiesFromFile.ToDictionary(c => c.Name);
然后,如果你必须分开列表,你可以通过:
List<Company> toyotaList = dictionaryFromFile["Toyota"];
// etc