C# .NET 序列化与反序列实现 、 细节

发布时间:2024年01月25日

在C#中,序列化和反序列化可以通过使用System.Runtime.Serialization命名空间下的DataContractSerializer类来实现。下面是一个简单的实现例子:

首先,定义一个需要序列化和反序列化的类,例如:

 static void Main(string[] args)
 {
     VisualStudio vs = new VisualStudio();
     vs.Font = "微软雅黑";
     vs.FontColor = "蓝色";
     vs.BackGoundColor = "白色";
     string path = @"C:\Users\86155\Desktop\2.txt";
     using (FileStream fsWrite = new FileStream(path, FileMode.Create, FileAccess.Write))
     {
         BinaryFormatter bf = new BinaryFormatter();
         bf.Serialize(fsWrite, vs);
     }
     Console.WriteLine("序列化成功");

     using (FileStream fsRead = new FileStream(path, FileMode.Open, FileAccess.Read))
     { 
         BinaryFormatter bf = new BinaryFormatter();
         VisualStudio v =  (VisualStudio) bf.Deserialize(fsRead);
         Console.WriteLine($"软件的字体是{v.Font},字体颜色是{v.FontColor},背景颜色是{v.BackGoundColor}");
     }
     Console.ReadKey();

 }

C#序列化是将对象转换为可存储或传输的格式的过程,它在以下场景中非常有用:

  1. 数据持久化:将对象序列化为文件格式,可以将对象保存在磁盘上,以便在以后的时间加载和使用。这在应用程序需要保存用户设置、配置信息或其他数据时非常有用。

  2. 远程通信:在分布式系统中,可以使用序列化将对象转换为可以在网络上传输的格式。这样,不同的应用程序或系统可以通过网络共享数据。

  3. 缓存数据:序列化对象可以将其存储在缓存中,以提高应用程序的性能。这在需要频繁访问数据的情况下非常有用,例如在Web应用程序中缓存数据库查询结果。

  4. 对象传递:序列化对象可以在不同的应用程序之间传递,例如通过消息队列、远程调用或Web服务。这种方式可以实现不同语言或平台之间的互操作性。

  5. 反射和元数据:序列化可以将对象的结构信息和元数据保存到文件中,以便在运行时进行反射,动态创建对象或进行其他元数据操作。

总之,C#序列化在数据存储、远程通信、性能优化和元数据操作等场景中都有广泛的应用。

在C#中进行序列化时,有一些细节需要注意:

  1. 类需要标记为可序列化:要使一个类可以被序列化,需要在类的声明上添加[Serializable]属性。这告诉编译器该类可以被序列化。

  2. 可序列化字段和属性:要将一个字段或属性序列化,需要确保它们是可访问的,并且具有public或protected修饰符。

  3. 序列化容器类:如果一个类包含其他可序列化的对象,需要确保这些包含的对象也是可序列化的。

  4. 非序列化字段:有些字段可能不需要序列化,比如临时计算的值或敏感信息。可以使用[NonSerialized]属性来标记这样的字段。

  5. 序列化版本控制:如果在序列化后修改了类的结构,比如添加或删除了字段或属性,可以使用[OptionalField]属性来处理版本控制。

  6. 使用BinaryFormatter:在C#中进行序列化,可以使用BinaryFormatter类来将对象写入到文件或内存流中,以及从文件或内存流中读取对象。

  7. 异常处理:当进行序列化时,可能会遇到各种异常,比如目标文件不存在、文件访问权限不足等。需要使用try-catch块来捕获这些异常,并进行适当的处理。

  8. 安全性:在进行序列化时,需要注意安全性问题。只序列化需要的数据,并且永远不要将敏感信息直接序列化。

  9. 性能考虑:序列化是一种开销较大的操作,尤其是对于大型对象或对象图。需要考虑到性能问题,并选择最优的序列化方式。

总之,C#序列化需要注意以上细节,以确保对象可以正确地被序列化和反序列化,并确保安全性和性能。

文章来源:https://blog.csdn.net/blu_e__heart/article/details/135736662
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。