这是我在Pulling objects from binary file and putting in List<T>提出的问题的分支以及David Torrey在Serializing and Deserializing Multiple Objects提出的问题。
我不知道这是否可能。假设我有一个应用程序,它使用五个不同的类来包含必要的信息,以执行应用程序所做的任何事情。这些类不相互引用,并且具有各种数量的内部变量等。我想将从这些类中生成的对象集合保存到单个保存文件中,然后能够将它们读出来。由于对象是从不同的类创建的,因此无法进入要发送到光盘的列表。我原本以为使用sizeof(this)之类的东西来记录要在文件开头保存的表中记录的对象的大小,然后有一个公共的GetObjectType(),它返回一个可操作的值作为对象的类型它会起作用,但显然sizeof不会像我想象的那样工作,所以现在我回到了1号广场。
答案 0 :(得分:1)
几个选项:将所有对象包装在一个更大的对象中并对其进行序列化。问题是你不能反序列化一个对象,你必须加载所有对象。如果你有10个对象,每个对象都是几个megs,那不是一个好主意。您希望随机访问任何对象,但您不知道文件中的偏移量。 “包装器”对象可以像List<object>
一样简单,但我会使用自己的对象来提高类型安全性。
第二个选项:使用固定大小的文件页眉/页脚。将每个对象序列化为MemoryStream,然后将各个对象的内存流转储到文件中,记住每个对象中的字节数。最后在文件的开头或结尾添加一个固定大小的块,以记录各个对象开始的文件中的偏移量。在下面的示例中,文件头首先包含文件中的对象数(作为整数),然后为每个对象提供一个整数,给出每个对象的大小。
// Pseudocode to serialize two objects into the same file
// First serialize to memory
byte[] bytes1 = object1.Serialize();
byte[] bytes2 = object2.Serialize();
// Write header:
file.Write(2); // Number of objects
file.Write(bytes1.Length); // Size of first object
file.Write(bytes2.Length); // Size of second object
// Write data:
file.Write(bytes1);
file.Write(bytes2);
objectN的偏移,是标题PLUS的大小,是所有大小的总和,最大为N.所以在这个例子中,要读取文件,你就像这样读取标题(伪,再次)
numObjs = file.readInt();
for(i=0..numObjs)
size[i] = file.readInt();
之后,您可以计算并寻找对象N的正确位置。
第三个选项:使用为您执行选项#2的格式,例如zip。在.NET中,您可以使用System.IO.Packaging
创建结构化zip(OPC格式),或者如果要使用自己的zip格式,则可以使用第三方zip库。