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