正在保存对象/序列化

本文关键字:序列化 对象 保存 | 更新日期: 2023-09-27 18:00:45

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

在C语言中,如果你想保存数据结构,我被教导过,将其以文本格式保存为字符串通常是不必要的,而作为内存快照存在的二进制文件通常更好,因为它不需要编码/解码以及将字符串与字段匹配。在C#中,方法似乎有所不同,它将对象字段单独转换为字符串或其他格式,然后在必要时重建对象。我不确定二进制序列化是如何工作的,但我认为它只是将数据转换为某种格式,而不是作为一个纯粹的非格式化内存快照存在。

为什么没有任何编码/解码的"内存快照"方法没有在C#中使用?我唯一能想到的原因是与其他代码和环境的兼容性,也许这与对象与规则结构的复杂性有关。

正在保存对象/序列化

在C#中,您无法访问对象的内存布局。您无法获取对象的内存快照,也无法从快照创建对象。事实上,你甚至没有点(是的,你在不安全的代码中有点,但你很少写不安全的码)。

即使您确实可以访问对象使用的内存,它也可能无法保存到磁盘然后重新加载。如果升级。NET环境中,您可能会得到一个更好的优化器,它可以决定以不同的方式重新排列对象的字段,或者使用不同的内存对齐方式。

简而言之,没有对对象内存的访问,所以需要逐个字段序列化。

好的一面是,从那以后。NET具有反射,以这种方式序列化对象并不困难。事实上,它比序列化一个包含指向其他C++类的指针的C++类要容易得多。

。NET二进制序列化格式遵循类型的存储方式,并放入一些元数据,以便您知道如何对其进行解码(哪种类型、字段名等)。

这主要不适用于与的互操作。NET语言——尽管它可能是。它是为了与相同对象的过去和未来版本进行互操作,可以以一种对这些更改具有弹性的方式进行编写,或者至少知道拒绝它们。

在C中,如果您以任何方式更改结构——并且您刚刚使用write()来存储内存,那么您可能还会选择编写一些元数据,这样您就可以知道您是否拥有正确的版本(并且需要转换)。

另一个好处是。NET语言知道如何处理引用。默认情况下,C将write()作为一个地址,这在以后将毫无用处。NET还支持不应该序列化的字段(比如密码)的想法——这是在C版本中需要手工编写的另一件事。