为什么我们不能将对象序列化为随机存取文件?另一方面,我们可以将对象序列化为顺序访问文件?
""C#不提供在运行时获取对象大小的方法。这意味着,如果我们序列化这个类,我们不能保证一个固定长度的记录大小"“(来自我读的那本书)。
所以我们不能读取随机存取文件,因为我们不知道文件中每个对象的大小,所以我们如何查找?
发布于 2009-08-23 14:32:37
任何用SerializableAttribute属性标记的对象都可以序列化(在大多数情况下)。序列化的结果总是指向一个流,它很可能是一个文件输出流。
您是否在问为什么对象图不能部分反序列化?.NET序列化只反序列化整个对象图。否则,您将不得不转向其他序列化格式化程序,或者编写自己的序列化格式化程序。
对于对文件的直接随机访问,必须使用支持查找的流打开该文件。
编辑:
在序列化得到的流中查找没有实际意义--只有序列化格式化程序知道里面有什么,并且应该始终在流的最开始处输入。
为了将数据持久化到其他结构中;在两个阶段的过程中这样做:首先,将串行化字节定向到一个即内存后备的流,然后使用所述大小的知识将数据写入实际的后备存储器。
您无法预测序列化对象的大小,因为序列化表示可能与运行时表示有很大不同。
如果您只使用原语类型,并且使用BinaryWriter编写,那么仍然有可能实现对输出大小的精确控制-但这本身并不是序列化。
发布于 2009-08-23 15:30:10
.NET中默认的二进制序列化序列化整个对象图,由于其图的性质,它没有恒定的大小,这意味着每个序列化对象(记录)都不会有恒定的大小,从而防止随机访问。
为了能够随机访问文件中的任何记录,请编写您自己的类的二进制序列化实现,或者使用数据库。如果您需要一个简单的、无需安装的单线程数据库引擎,可以看看SQL Server Compact。
https://stackoverflow.com/questions/1318702
复制相似问题