2009-08-23 116 views
0

为什么我们无法将对象序列化为随机访问文件?另一方面,我们可以将对象序列化为顺序访问文件?为什么我们不能序列化这些对象?

“”C#没有提供在运行时获取对象大小的方法。这意味着,如果我们序列化这个类,我们不能保证一个固定长度的记录大小(“从我读入的书中)”。

因此,我们不能读取随机存取文件,因为我们不知道文件中的每个对象大小,所以我们如何才能找到??????

+3

你是什么意思的“随机访问文件”。你可以序列化对象到任何继承自'System.Stream'的类上。 – 2009-08-23 14:28:37

+0

你能否包含不起作用的示例代码? – Richard 2009-08-23 14:52:10

+0

编辑后检查问题。 – Sherif 2009-08-23 15:08:35

回答

2

标记为SerializableAttribute属性的任何对象都可以序列化(在大多数情况下)。序列化的结果总是定向到一个流,这很可能是一个文件输出流。

你问为什么一个对象图不能部分反序列化?只有.NET序列化[de]序列化完整的对象图。否则,你将不得不转向其他序列化格式化器,或者写你自己的。

对于直接随机访问文件,您必须使用支持查找的流来打开该文件。

编辑:

从序列化所产生的数据流中寻找有没有实际意义 - 只有serialiation格式化器知道在那里有什么呢,应该不停进食流的最开始。

用于将数据保存到其他结构中;在两阶段过程中进行:首先,将序列化字节定位到[即内存支持]流,您可以从之后读取大小,然后使用所述大小知识将数据写入实际的后备存储。

您无法预测序列化对象的大小,因为序列化表示形式可能与运行时表示形式有很大差异。

如果只使用原始类型,并且使用BinaryWriter编写 - 但这不是序列化,它仍然可以实现对输出大小的精确控制。

+0

“”C#没有提供在运行时获取对象大小的方法。这意味着,如果我们序列化这个类,我们不能保证一个固定长度的记录“”(从我读入的书中)。 所以我们不能读取随机访问文件,因为我们不知道文件中的每个对象的大小,所以我们如何才能找到?????? – Sherif 2009-08-23 15:07:32

+0

你总是可以序列化到一个流,从中你可以解读写入的字节数。 MemoryStream是一个很好的选择。之后,数据可以通过其他方式保存,前缀或长度索引。 – 2009-08-23 15:37:32

0

.NET中的默认二进制序列化将整个对象图序列化,该对象图根据其图形性质不具有常数大小,这意味着每个序列化对象(记录)的大小不会是常量,防止随机访问。

为了能够随机访问文件中的任何记录,编写自己的类的二进制序列化实现或使用数据库。如果您需要一个简单的,没有安装的单线程数据库引擎,请查看SQL Server Compact

+0

图形在其序列化状态下的大小非常稳定;) – 2009-08-23 15:49:50

+0

确实如此,但它与问题或我的答案没有关系。在编译时无法预测对象的序列化大小,因为整个对象图需要在运行时序列化。运行时的图形大小无法保证。 – 2009-08-24 13:31:23

相关问题