为什么我们不能将对象序列化为随机访问文件?另一方面,我们可以将对象序列化为顺序访问文件吗?
“”C#没有提供在运行时获取对象大小的方法。这意味着, 如果我们序列化类,我们不能保证固定长度的记录大小“”(从我读过的书中)。
所以我们无法读取随机访问文件,因为我们不知道文件中的每个对象大小,所以我们如何才能寻找??????
答案 0 :(得分:2)
任何标有SerializableAttribute
属性的对象都可以序列化(在大多数情况下)。序列化的结果总是指向一个流,这可能很好地是一个文件输出流。
您是否在问为什么对象图不能部分反序列化?仅限.NET序列化[de]序列化完整的对象图。否则,您将不得不转向其他序列化格式化程序,或编写自己的格式化程序。
要直接随机访问文件,您必须使用支持搜索的流打开文件。
编辑:
从序列化中查找生成的流没有实际意义 - 只有串行格式化程序知道那里有什么,并且应该总是在流的最开始处输入。
将数据保存到其他结构中;在两个阶段的过程中完成:首先,将序列化字节定位到[即内存支持的流,您可以从之后读取大小,然后使用所述的大小知识将数据写入实际的后备存储。
您无法预测序列化对象的大小,因为序列化表示可能与运行时表示有很大不同。
如果你只使用原始类型,你仍然可以实现对输出大小的精确控制,你使用BinaryWriter编写 - 但这不是序列化本身。
答案 1 :(得分:0)
.NET中的默认二进制序列化序列化整个对象图,它本质上是一个图形,没有常量大小,这意味着每个序列化对象(记录)不会有一个常量,防止随机访问。
为了能够随机访问文件中的任何记录,编写您自己的类的二进制序列化实现,或使用数据库。如果您需要一个简单的,无安装的单线程数据库引擎,请查看SQL Server Compact。