您的位置 首页 > 娱乐休闲

C#初学者教程系列23:序列化和反序列化

本文是C#初学者简单教程,这是第23篇。感谢观看,记得关注我,后续还有更多教程文章,谢谢。

本文环境为Visual Studio 2019。

每当必须将与对象有关的数据从一个应用程序发送到另一个应用程序时,就会使用序列化和反序列化的概念。序列化用于将应用程序数据导出到文件中。然后,目标应用程序使用反序列化从应用程序中提取数据以供进一步使用。

序列化是将C#类对象写入或序列化到文件的概念。假设您有一个名为“家庭”的C#类。该类具有“名称”和“人数”2个属性。

序列化可用于直接将“家庭”类的数据属性写入文件。反序列化用于从文件读取数据并再次构造还原出“家庭”对象。

让我们看一个如何实现此目标的示例。

在我们的示例中,我们将在代码中执行以下步骤:

  1. 创建一个名为“家庭”的类,它具有2个属性,即“名称”和“人数”。
  2. 然后,我们将从类中创建一个对象,并将“名称”属性的值分配为“我的五口之家”,并将“ 人数”属性的值设为5。
  3. 然后,我们将使用序列化将上述对象序列化为一个名为“家庭.txt”的文件
  4. 最后,我们将使用反序列化从文件反序列化对象,并在控制台中显示值。

在控制台应用程序的文件中输入以下代码。

第一步:编写我们的“家庭”类

代码说明:

  1. 需要序列化的类需要具有[Serializable]属性。这是C#中的关键字。我们将此关键字添加到“家庭”类。如果不标记此属性,则在尝试序列化类时会出现错误。
  2. 接下来是将要序列化的类的定义。在这里,我们定义了一个名为“家庭”的类,并提供2个属性,一个是“ 名称”,另一个是“ 人口”。

第二步:在这一步中,我们将创建“家庭”类的对象并将其序列化到“家庭.txt”的文件中。

代码说明:

  1. 首先,我们创建“家庭”类的对象。然后,将值“ 我的五口之家”分配给名称属性,将“5”分配给人口属性。
  2. 然后,我们使用格式化程序类,该类用于将对象序列化或转换为二进制格式。序列化文件中的数据是以二进制格式完成的。接下来,我们创建一个文件流对象。文件流对象用于打开文件“家庭.txt”以供写入。关键字FileMode.Create和FileMode.Write用于专门创建和写入的文件。
  3. 最后,我们使用Serialize方法将二进制数据传输到文件。由于写操作已完成,因此我们将关闭流。

第三步:最后,为了确保文件中存在数据,我们使用反序列化从文件中反序列化对象。

这么做是为了验证一下,我们的序列化操作是否成功。

代码说明:

  1. 我们创建对象“ stream”以只读模式打开文件“家庭.txt”。
  2. 然后,我们使用序列化程序类,该类用于反序列化对象。返回的对象设置为obj。
  3. 最后,我们在控制台中打印输出“名称”和“人口”属性。

编写上面的代码,并使用Visual Studio运行该项目时,您将获得以下输出。

下面我们提供一下完整源码:

using System; using Sy; using Sy; using Sy; using Sy; using Sy.Formatters.Binary; using Sy; using Sy; namespace ConsoleApp6 { class Program { static void Main(string[] args) { 家庭 family = new 家庭(); family.名称 = "我的五口之家"; family.人口 = 5; IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream(@"D:\家庭.txt", FileMode.Create, FileAcce); (stream, family); (); Stream stream2 = new FileStream(@"D:\家庭.txt", FileMode.Open, FileAcce); 家庭 obj = (家庭(stream2); Con(obj.名称); Con(obj.人口); } } [Serializable] public class 家庭 { public string 名称 { get; set; } public int 人口 { get; set; } } }

关于NewtonSoft

通常,我们编程,将会使用第3方的Newtonsoft,您可以在Nuget中搜索,如下图:

这是由于Newtonsoft具有比C#类库提供的序列化更高的性能以及更好的使用性。


祝您用餐愉快。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“如何序列化一个类的成员对象”边界阅读