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

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

本文环境为Visual Studio 2019。

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

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

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

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

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

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

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

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

代码说明:

  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 System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

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, FileAccess.Write);

            formatter.Serialize(stream, family);
            stream.Close();

            Stream stream2 = new FileStream(@"D:\家庭.txt", FileMode.Open, FileAccess.Read);
            家庭 obj = (家庭)formatter.Deserialize(stream2);
            Console.WriteLine(obj.名称);
            Console.WriteLine(obj.人口);
        }


    }

    [Serializable]
    public class 家庭
    {
        public string 名称 { get; set; }
        public int 人口 { get; set; }
    }
}

关于NewtonSoft

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

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

 

祝您用餐愉快。

 

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值