保存对象/序列化

6

我正在尝试从C转换到C#,有一些关于将对象保存到文件和序列化的问题。

在C中,如果想要保存数据结构,我学过的方法是将其保存为二进制文件而不是文本格式的字符串,因为它不需要编码/解码和匹配字符串到字段。它存在于内存快照中,通常更好,但在C#中,这种方法似乎不同。它会将对象字段分别转换为字符串或其他格式,然后在必要时重新构建对象。我不确定二进制序列化如何工作,但我认为它仍会将数据转换为某种格式,并不存在为纯非格式化的内存快照。

为什么C#不使用没有任何编码/解码的“内存快照”方法? 我唯一能想到的原因是与其他代码和环境的兼容性有关,也可能与对象的复杂性有关。


如果对象具有复杂属性,而不仅仅是值类型,则对象的每个“部分”将存储在不同的内存位置上;此外,这些对象可能包含其他对象。只是一个简单的猜测,但执行这样的逻辑以保存对象会非常复杂。 - daryal
.NET的抽象化内存和硬件等方面是一个极大的成本降低和提高生产力的好处。如果您需要坚持基本要求,请让框架处理繁重的工作(通常是这样做的),并使用[System.Runtime.Serialization.Formatters.Binary]中可用的类来标记您的类[Serializable] 。 - Michael
2个回答

2
在C#中,您无法访问对象的内存布局。您不能获取对象的内存快照,也不能从快照创建对象。事实上,您甚至没有指针(是的,在不安全的代码中有它们,但您很少编写不安全的代码)。
即使您可以访问对象使用的内存,它可能无法在保存到磁盘然后重新加载后生存。如果升级.NET环境,则可能会获得更好的优化器,该优化器决定以不同方式重新排序对象的字段或使用不同的内存对齐方式。
因此,简而言之 - 没有访问对象内存,因此需要逐个序列化字段。
好处是,由于.NET具有反射功能,因此以这种方式序列化对象并不难。实际上,它比序列化持有指向其他C ++类的指针的C ++类要容易得多。

因为.NET框架在内存管理方面做了很多工作,所以您没有直接访问内存的权限,即使您有这样的权限也是危险的。非常有道理,谢谢! :) - user3604097

1
.NET二进制序列化格式遵循类型的存储方式,并添加一些元数据,以便您知道如何解码它(哪种类型、哪个字段名称等)。这不是主要用于与.NET语言进行互操作-尽管它可以。它是用于与过去和未来版本的相同对象进行互操作的,这些对象可以以一种对这些更改具有弹性的方式编写-或者至少知道拒绝它们。在C中,如果以任何方式更改结构-并且您刚刚使用write()存储内存,则可能还会选择编写一些元数据,以便您可以知道是否具有正确版本(并需要转换)。另一个好处是.NET语言知道如何处理引用。默认情况下,C会写入地址,后来将无用。 NET还支持不应序列化的字段的概念(例如密码)-这是您需要手动编写的C版本中的另一件事。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接