Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
C#编程基础之序列化_创想鸟

C#编程基础之序列化

一、序列化的含义

序列化是将对象处理为字节流以存储对象或传输到内存、数据库或文件。其主要目的是保存对象的状态,以便可以在需要时重新创建对象。相反的过程称为反序列化。

1.1 序列化的工作方式

此图显示序列化的整个过程。

915.jpg

对象被序列化为流。流传递的不仅是数据,还包括有关对象类型的信息,如对象的版本、区域性和程序集名称。通过该流,可以将对象存储在数据库、文件或内存中。

 

1.2 用于序列化

通过序列化,开发人员可以保存对象的状态,并在需要时重新创建该对象,从而提供对象的存储以及数据交换。通过序列化,开发人员还可以执行类似如下的操作:通过 Web 服务将对象发送到远程应用程序、将对象从一个域传递到另一个域、以 XML 字符串的形式跨防火墙传递对象,或者跨应用程序维护安全信息或用户特定信息。

 

1.3 使对象可序列化

若要序列化对象,您需要待序列化的对象、要包含序列化对象的流,以及一个 Formatter。 System.Runtime.Serialization包含序列化和反序列化对象所需的类。

将 SerializableAttribute 特性应用于一个类型可指示该类型的实例可以序列化。尝试序列化时,如果类型没有 SerializableAttribute 特性,将引发SerializationException 异常。

如果不希望类中的字段可序列化,请应用 NonSerializedAttribute 特性。如果可序列化类型的字段包含指针、句柄或其他一些专用于特定环境的数据结构,并且不能在不同的环境中以有意义的方式重建,则可能需要使该字段不可序列化。

如果已序列化的类包含对标记为 SerializableAttribute 的其他类的对象的引用,则也将序列化这些对象。

 

1.3.1 二进制序列化和 XML 序列化

可以使用二进制序列化或 XML 序列化。在二进制序列化中,会序列化所有成员(甚至包括那些只读成员),从而可以提高性能。XML 序列化提供了可读性更好的代码,并在对象共享和使用方面提供了更大的灵活性,以便实现互操作性。

 

1.3.2 二进制序列化

二进制序列化使用二进制编码来生成精简的序列化,以用于存储或基于套接字的网络流等。

 

1.3.3 XML 序列化

XML 序列化将对象的公共字段和属性或者方法的参数及返回值序列化为符合特定 XML 架构定义语言 (XSD) 文档的 XML 流。XML 序列化会生成具有转换为 XML 的公共属性和字段的强类型类。 System.Xml.Serialization 包含序列化和反序列化 XML 所需的类。

您可以将特性应用于类和类成员,以控制 XmlSerializer 序列化或反序列化类实例的方式。

 

1.3.4 SOAP 序列化

XML 序列化还可用于将对象序列化为符合 SOAP 规范的 XML 流。SOAP 是一种基于 XML 的协议,它是专门为使用 XML 来传输过程调用而设计的。如同常规的 XML 序列化,特性可用于控制 XML Web services 生成的文本样式的 SOAP 消息。

 

1.3.5 基本序列化和自定义序列化

可以通过两种方式执行序列化:基本序列化和自定义序列化。基本序列化使用 .NET Framework 来自动序列化对象。

 

1.3.5.1 基本序列化

基本序列化的唯一要求是对象必须应用 SerializableAttribute 特性。 

NonSerializedAttribute 可用于禁止序列化特定字段。

使用基本序列化时,对象的版本控制可能会产生问题,在这种情况下,自定义序列化可能更合适。基本序列化是执行序列化的最简单的方法,但对进程提供的控制并不多。

1.3.5.2 自定义序列化

在自定义序列化中,可以准确地指定将序列化哪些对象以及如何完成序列化。类必须标记为 SerializableAttribute,并实现 ISerializable 接口。

如果希望同样以自定义方式反序列化对象,则必须使用自定义构造函数。

1.3.6 设计器序列

设计器序列化是一种特殊形式的序列化,它涉及通常与开发工具关联的对象持久性的种类。设计器序列化是将对象图转换为以后可用于恢复对象图的源文件的过程。源文件可以包含代码、标记,甚至包含 SQL 表信息。有关更多信息,请参见Designer Serialization Overview。

二、通过序列化保存对象数据

虽然您可以在设计时将对象的属性设置为默认值,但是,如果该对象被损环,则在运行时输入的所有值均会丢失。 可以使用序列化在实例之间保持对象数据,从而能够存储值并且在下次实例化对象时检索这些值。

在本演练中,将创建一个简单的对象,并将该对象的数据保存到文件中。然后,当您重新创建对象时将从该文件检索数据。最后,将修改代码以使用 SOAP 格式保持对象。

2.1 使用序列化保存对象

   [Serializable]  //将类标记为可序列化    public class Coupon : INotifyPropertyChanged    {        public decimal Amount { get; set; }        public float InterestRate { get; set; }        public int Term { get; set; }        private string _name;        public string Name        {            get { return _name; }            set            {                _name = value;                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Customer"));            }        }        [field: NonSerialized()]    //将可序列化的类中的某字段标记为不被序列化        public event PropertyChangedEventHandler PropertyChanged;        public Coupon(decimal amount, float interestRate, int term, string name)        {            Amount = amount;            InterestRate = interestRate;            Term = term;            _name = name;        }    }static void Main(string[] args){            const string fileName = @"demo1.txt";            var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");            using (var stream = File.Create(fileName))            {                var deserializer = new BinaryFormatter();  //二进制格式序列化器                deserializer.Serialize(stream, coupon);  //序列化对象到文件中            }}

916.jpg

现在尝试反序列化,看看与之前 Coupon 对象的值是否一致。

static void Main(string[] args){            const string fileName = @"demo1.txt";            //var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");            //判断该文件是否存在            if (!File.Exists(fileName))            {                return;            }            using (var stream = File.OpenRead(fileName))            {                var deserializer = new BinaryFormatter();   //二进制序列化器                var coupon = deserializer.Deserialize(stream) as Coupon;    //反序列化                if (coupon == null)                {                    return;                }                Console.WriteLine($"{nameof(Coupon)}:");                Console.WriteLine($"    {nameof(coupon.Amount)}: {coupon.Amount}");                Console.WriteLine($"    {nameof(coupon.InterestRate)}: {coupon.InterestRate}%");                Console.WriteLine($"    {nameof(coupon.Term)}: {coupon.Term}");                Console.WriteLine($"    {nameof(coupon.Name)}: {coupon.Name}");            }            Console.Read();}

917.jpg

2.2 使用 SOAP 格式保存对象

static void Main(string[] args){            const string fileName = @"demo1.txt";            var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");            using (var stream = File.Create(fileName))            {                var deserializer = new SoapFormatter(); //Soap 格式化器                deserializer.Serialize(stream, coupon); //序列化            }}

918.jpg

反序列化时也采用 SoapFormatter 即可

var deserializer = new SoapFormatter();   //Soap 格式化器var coupon = deserializer.Deserialize(stream) as Coupon;    //反序列化

【注意】本示例将数据存储到二进制或 SOAP 格式的文件中。不应将这些格式用于敏感数据,如密码或信用卡信息。

【备注】二进制格式对于大多数 Windows 应用程序均适用。但对于 Web 应用程序或 Web 服务,您可能希望使用 SOAP 格式将对象保存到 XML 文件中,以使对象易于共享。

同样,也可以通过 XmlSerializer 将对象序列化保存在 XML 文件。我们可以根据需求选择合适的序列化器,操作基本是一样的。

以上就是C#编程基础之序列化的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432100.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 06:12:26
C#汉字转拼音(支持多音字)
下一篇 2025年12月17日 06:12:36

相关推荐

  • VSCode配置GDB调试器 深入掌握VSCode调试C程序技巧

    配置vscode中gdb调试c程序的核心是正确设置tasks.json和launch.json;2. tasks.json负责使用gcc -g编译生成带调试信息的可执行文件,确保prelaunchtask与launch.json中的program路径一致;3. launch.json指定调试器gdb…

    2026年9月22日
    100
  • VSCode配置C语言调试环境 从零开始VSCode搭建C开发工具

    要从零开始在#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8中搭建c语言开发和调试环境,首先需安装vscode本体、c/c++编译器(如mingw或gcc)并配置系统环境变量,接着安装vscode的c/c++扩展,然后创建项目并编写c…

    2026年9月22日
    000
  • VSCode如何实现代码可视化调试 VSCode执行流程图形化分析方法

    vscode的可视化调试功能通过内置调试器和扩展生态,显著提升代码理解与问题排查效率。1. 首先配置launch.json文件以定义调试环境,支持多种语言如node.js、python等;2. 在代码中设置断点,程序运行至断点时暂停,便于检查变量状态和执行上下文;3. 利用调试面板查看变量、监视表达…

    2026年9月22日
    000
  • 玩转 Spring Boot 集成篇(定时任务框架Quartz)

    玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)

    在日常项目研发中,定时任务可谓是必不可少的一环,关于 spring boot 如何实现静态定时任务、动态定时任务以及如何开启多线程跑任务,均已在上篇分享过,不再赘述。 虽然 Spring Boot 内置注解方式实现的定时任务,在一定程度上也能解决一定的业务场景问题,但是若做更复杂的动作,例如启停任务…

    2026年9月22日 用户投稿
    200
  • VSCode安装C/C++代码格式化 专业VSCode开发环境配置

    配置VSCode进行C/C++开发需安装C/C++扩展包和clang-format,设置自动格式化与调试环境,推荐使用CMake Tools、Include Autocomplete等扩展,结合快捷键、代码片段和任务自动化提升效率。 配置VSCode以实现C/C++代码的专业格式化和高效开发环境,核…

    2026年9月22日
    500
  • Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)

    could not find doxygen (missing: doxygen_executable)  使用cmake .. 有时候会遇到如下问题: 代码语言:javascript代码运行次数:0运行复制 $ cmake ..– The CXX compiler identification …

    2026年9月22日
    100
  • VSCode如何集成Jai游戏开发环境 VSCode配置高性能游戏编程工作流

    配置#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8集成jai游戏开发环境的核心在于正确设置编译器与调试器并利用扩展提升效率,1. 配置settings.json指定jai.compilerpath、builddirectory、in…

    2026年9月22日
    500
  • VSCode如何自定义文件图标 VSCode资源管理器视觉优化的技巧

    自定义vscode文件图标需安装图标主题扩展,如material icon theme;2. 通过扩展市场安装后,在文件图标主题设置中启用;3. 选择主题时应考虑视觉风格、图标覆盖率、辨识度和更新频率;4. 可结合文件嵌套、隐藏文件夹、缩进指南等设置优化资源管理器视觉体验;5. 自定义图标对性能影响…

    2026年9月21日
    100
  • MacBookPro怎么下VSCode_MacBookPro下载安装VSCode详细教程

    访问code.visualstudio.com下载Mac通用版安装包;2. 解压后将Visual Studio Code.app拖入“应用程序”文件夹;3. 首次运行需右键选择“打开”以绕过安全限制;4. 推荐安装Python、Prettier等常用插件并配置环境变量;5. 若字体模糊可调整zoom…

    2026年9月21日
    200
  • 一周学会蝴蝶号无人直播的完整课程计划推荐

    一周学会蝴蝶号无人直播的完整课程计划推荐一周学会蝴蝶号无人直播的完整课程计划推荐一周学会蝴蝶号无人直播的完整课程计划推荐一周学会蝴蝶号无人直播的完整课程计划推荐

    掌握“蝴蝶号”无人直播的核心要义,一周内可搭建初步系统并具备独立操作能力。1.第一天厘清概念并完成基础环境搭建;2.第二天熟悉obs基础操作与场景构建;3.第三天准备高质量内容素材并确定风格;4.第四天设置自动化逻辑与推流配置;5.第五天处理互动机制及常见问题;6.第六天进行首次正式直播并复盘;7.…

    2026年9月21日 用户投稿
    200
  • VSCode报错怎么显示中文_VSCode错误信息本地化与中文显示教程

    安装中文语言包可将VSCode界面和错误提示转为中文,提升使用便捷性;但外部工具如编译器、解释器生成的报错仍为英文,因VSCode仅显示其原始输出,无法翻译。 在VSCode中让报错信息显示中文,核心在于安装并启用官方的中文(简体)语言包。这不仅仅是针对错误信息,而是将整个VSCode的用户界面本地…

    2026年9月21日
    400
  • 编译CEGUI「建议收藏」

    大家好,很高兴再次与你们见面,我是你们的老朋友全栈君。 平台: Windows 7 / 64位 / VS2005 CEGUI下载 地址:https://www.php.cn/link/9a2327a2fcc570914ce9c9e61581cbf8 源码选择: CEGUI 0.7.9 库源码下载 这…

    2026年9月21日
    100
  • 如何使用XGBoost训练AI大模型?优化机器学习模型的步骤

    XGBoost并非用于训练GPT类大模型,而是擅长处理结构化数据的高效梯度提升算法,其优势在于速度快、准确性高、支持并行计算、内置正则化与缺失值处理,适用于表格数据建模;通过分阶段超参数调优(如学习率、树深度、采样策略)、结合贝叶斯优化与交叉验证,并配合特征工程、数据预处理和集成学习等关键步骤,可显…

    2026年9月21日
    200
  • mysql如何设置自动重连

    答案:通过连接配置、连接池和应用层逻辑实现MySQL自动重连。启用MYSQL_OPT_RECONNECT选项(旧版本),推荐使用连接池如PooledDB、HikariCP并配置ping机制,应用层捕获连接异常后重试,结合指数退避策略提升稳定性。 MySQL 客户端或应用程序在连接断开后无法自动恢复,…

    2026年9月21日
    100
  • Windows11提示“应用程序无法正常启动(0xc000007b)”怎么解决_Windows11应用程序启动0xc000007b修复方法

    首先使用SFC工具修复系统文件,再重新安装Visual C++运行库,接着更新DirectX组件,最后可借助专用DLL修复工具解决0xc000007b错误。 如果您尝试在Windows 11上启动某个应用程序,但弹出“应用程序无法正常启动(0xc000007b)”的错误提示,则可能是由于系统文件损坏…

    2026年9月20日
    100
  • 如何为VSCode配置C++开发环境?

    答案:配置VSCode的C++环境需安装MinGW-w64编译器并添加到PATH,安装C/C++和可选Code Runner扩展,创建.c_cpp_properties.json、tasks.json和launch.json文件以配置编译器路径、编译任务和调试设置,最后通过编译运行测试代码验证配置成…

    2026年9月20日
    100
  • VSCode的侧边栏图标代表什么?

    资源管理器(文件夹图标)用于管理项目文件结构,支持新建、重命名、删除和拖拽操作;2. 搜索(放大镜图标)实现全局文本查找与替换,支持正则表达式及范围筛选;3. 源代码管理(分支图标)集成Git功能,可查看变更、提交代码并同步远程仓库;4. 运行和调试(虫子图标)支持断点调试、变量监控及多语言启动配置…

    2026年9月20日
    000
  • Linux如何将进程放入后台运行

    将Linux进程放入后台运行主要有四种方法:使用&符号在启动时放入后台;通过Ctrl+Z暂停后用bg继续运行;结合nohup与&防止会话关闭导致终止;使用screen或tm…

    2026年9月20日
    000
  • 怎样在VSCode中重命名变量或文件?

    使用F2键可快速重命名变量或文件,VSCode会自动更新符号引用,支持多语言,重命名文件时需注意导入路径可能需手动调整。 在 VSCode 中重命名变量或文件非常方便,可以通过内置的重构功能快速完成,同时保持代码的一致性。 重命名变量(符号重命名) 当你想重命名代码中的变量、函数或类时,VSCode…

    2026年9月20日
    100
  • OpenBSD 7.8 发布

    OpenBSD 7.8 正式推出,作为该项目的第 59 个发行版本,带来了多项重要更新与功能增强。主要变更包括: 初步加入对 Raspberry Pi 5 的支持 [详见此前报道]引入全新的分析子系统 [参见此前介绍]TCP 输入层现具备并行处理能力 [参见此前消息]并行 TCP 输入机制已完成性能…

    2026年9月13日
    200

发表回复

登录后才能评论
关注微信