当前位置: 首页 > news >正文

C#序列化与反序列化详解

在这里插入图片描述
在我们深入探时C#序列化和反序列化,之前我们先要明白什么是序列化,它又称串行化,是.ET运行时环境用来支持用户定义
类型的流化的机制。序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化
成原来的对象使用。其目的是以某种存储形成使自定义对象持久化,或者将这种对像从一个地方传输到另一个地方。.ET框
架提供了两种串行化的方式:
1、是使用Binary Formatteri进行串行化;
2、使用Soap Formatteri进行串行化;
3、使用XmlSerializeri进行串行化。
第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XL存储;第三种其实和
第二种差不多也是XL的格式存储,只不过比第二种的XML格式要简化很多(去掉了SOAP特有的额外信息)。可以使用
[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、2可以使用NonSerialized属性来标志,2、
可以使用[Xmllg nore]来标志。
下面就让上我们开始深入了解C序列化和反序列化:
C#序列化和反序列化1、使用BinaryFormatteri进行串行化
下面是一个可串行化的类:
代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.Ul;
using System.Web.Ul.WebControls;
using System.Web.Ul.WebControls.WebParts;
using System.Web.Ul.HtmlControls;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
/*summary
/ClassToSerialize的摘要说明
//</summary>
[Serializable]
public class ClassToSerialize
public int id =100;
public string name ="Name";
[NonSerialized
public string Sex=“男";
下面是串行化和反串行化的方法:
代码如下:
public void SerializeNow()
ClassToSerialize c=new ClassToSerialize();
FileStream fileStream
new FileStream("c:\\temp.dat",FileMode.Create);
BinaryFormatter b new BinaryFormatter();
b.Serialize(fileStream,c);
fileStream.Close();
public void DeSerializeNow()
ClassToSerialize c=new ClassToSerialize();
c.SeX=“kkkk";
FileStream fileStream
new FileStream("c:\temp.dat",
FileMode.Open,FileAccess.Read,FileShare.Read);
BinaryFormatter b new BinaryFormatter();
c b.Deserialize(fileStream)as ClassToSerialize;
Response.Write(c.name);
Response.Write(c.Sex);
fileStream.Close();

调用上述两个方法可以看到串行化的结果:Sex属性因为被标志为NonSerialized,故其值总是为null,

C#序列化和反序列化2、使用SoapFormatteri进行串行化和BinaryFomatter类似,我们只需要做一下简单修改即可:

a.将usingi语句中的.Formatter.Binaryi改为.Formatter.Soap;

b.将所有的BinaryFormatteri替换为Soap Formatter.

c.确保报存文件的扩展名为.xml

经过上面简单改动,即可实现SoapFormatter的串行化,这时候产生的文件就是一个ml格式的文件。

C#序列化和反序列化3、使用KmlSerializeri进行串行化

关于格式化器还有一个问题,假设我们需要XL,但是不想要SO八P特有的额的外信息,那么我们应该怎么办呢?有两中方案:

要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFommatter类,但是没有你不需要的信息;要么使用库类

XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。

如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:

a.添加System.Xml.Serialization命名空间。

b.Serializable和NoSerialized,属性将被忽略,而是使用Kmllgnore属性,它的行为与NoSerialized类似。

c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经满足了。

下面看C#序列化和反序列化示例:

要序列化的类:

代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.Ul;
using System.Web.Ul.WebControls;
using System.Web.Ul.WebControls.WebParts;
using System.Web.Ul.HtmlControls;
using System.Xml.Serialization;
代码如下:
[Serializable]
public class Person
private string name;
public string Name
get
{
<SPAN style="WHITE-SPACE:pre"></SPAN>return name;
<SPAN style="WHITE-SPACE:pre"></SPAN>)
<SPAN style="WHITE-SPACE:pre"></SPAN>set
<SPAN style="WHITE-SPACE:pre"></SPAN>{
<SPAN style="WHITE-SPACE:pre"></SPAN>
name value;
<SPAN style="WHITE-SPACE:pre"></SPAN>)
public string Sex;
public int Age =31;
public Course[]Courses;
public Person()
public Person(string Name)
<SPAN style="WHITE-SPACE:pre"></SPAN>name Name;
<SPAN style="VHITE-SPACE:pre"</SPAN>Sex=“男”;
}

代码如下:

[Serializable]
public class Course
{
public string Name;
[Xmllgnore]
public string Description;
public Course()
public Course(string name,string description)
<SPAN style="WHITE-SPACE:pre"></SPAN>Name name;
<SPAN style="WHITE-SPACE:pre"></SPAN>Description description;
}

C#序列化和反序列化方法:
代码如下:

public void XMLSerialize()
Person c new Person("cyj");
c.Courses new Course[2];
c.Courses[0]=new Course(英语”,“交流江具):
c.Courses[1]=new Course(数学”,自然科学"):
XmlSerializer xs new XmlSerializer(typeof(Person));
Stream stream new FileStream("c:\cyj.XML",FileMode.Create,FileAccess.Write,FileShare.Read);
xs.Serialize(stream,c);
stream.Close();
public void XMLDeserialize()
XmlSerializer xs new XmlSerializer(typeof(Person));
Stream stream new FileStream("C:\\cyj.XML",FileMode.Open,FileAccess.Read,FileShare.Read);
Person p xs.Deserialize(stream)as Person;
Response.Write(p.Name);
Response.Write(p.Age.ToString());
Response.Write(p.Courses[0].Name);
Response.Write(p.Courses[0].Description);
Response.Write(p.Courses[1].Name);
Response.Write(p.Courses[1].Description);
stream.Close();

这里Course类的Description属性值将始终为null,生成的xml文档中也没有该节点,如下:
代码如下:

xml version="1.0">
Person xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
Sex>/Sex>
Age>31 </Age>
Courses
×Course>
Name>英语Name>
Description>交流工具'Description>
×/Course>
Course>
Name>数学Name>
Description>自然科学Description>
</Course>
</Courses>
×Name>cyj </Name>
</Person>

C#序列化和反序列化4、自定义序列化

如果你希望让用户对类进行串行化,但是对数据流的组织方式不完全满意,那么可以通过在自定义类中实现接口来自定义串行化行为。这个接口只有一个方法,GetObjectData.这个方法用于将对类对象进行串行化所需要的数据填进SerializationInfo)对象。你使用的格式化器将构造SerializationInfo对象,然后在串行化时调用GetObjectData.如果类的父类也实现了ISerializable,那么应该调用GetObjectDatal的父类实现。如果你实现了ISerializable,那么还必须提供一个具有特定原型的构造器,这个构造器的参数列表必须与GetObjectData相同。这个构造器应该被声明为私有的或受保护的,以防止粗心的开发人员直接使用它。示例如下:

C#序列化和反序列化之实现ISerializable的类:

代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.Ul;
using System.Web.Ul.WebControls;
using System.Web.Ul.WebControls.WebParts;
using System.Web.Ul.HtmlControls;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
*lWW×summary>
/Employee的摘要说明
1//</summary
[Serializable]
public class Employee:ISerializable
public int Empld=100;
public string EmpName-"刘德华';
[NonSerialized]
public string NoSerialString ="NoSerialString-Test";
public Employee()
<SPAN style=-"WHITE-SPACE:pre"</SPAN>∥TODO:在比处添加构造函数逻辑
<SPAN style--"WHITE-SPACE:pre”></SPAN>}
private Employee(Serializationlnfo info,StreamingContext ctxt)
<SPAN style="WHITE-SPACE:pre"></SPAN>Empld =(int)info.GetValue("Employeeld",typeof(int));
<SPAN style="WHITE-SPACE:pre"></SPAN>EmpName =(String)info.GetValue("EmployeeName",typeof(string));
<SPAN style="WHITE-SPACE:pre"></SPAN>//NoSerialString =(String)info.GetValue("EmployeeString",typeof(string));
public void GetObjectData(Serializationlnfo info,Streaming Context ctxt)
<SPAN style="WHITE-SPACE:pre"></SPAN>info.AddValue("Employeeld",Empld);
<SPAN style="WHITE-SPACE:pre"></SPAN>info.AddValue("EmployeeName",EmpName);
<SPAN style="WHITE-SPACE:pre"></SPAN>//info.AddValue("EmployeeString",NoSerialString);
}

C#序列化和反序列化方法:
代码如下:

public void OtherEmployeeClassTest()
Employee mp new Employee();
mp.Empld 10;
mp.EmpName=“邱t枫”;
mp.NoSerialString=“你好呀";
Stream steam File.Open("c:\temp3.dat",File Mode.Create);
BinaryFormatter bf new BinaryFormatter();
Response.Write("Writing Employee Info:")
bf.Serialize(steam,mp);
steam.Close();
mp null;
C#序列化和反序列化之反序列化
Stream steam2 File.Open("c:\temp3.dat",FileMode.Open);
BinaryFormatter bf2 new BinaryFormatter();
Response.Write("Reading Employee Info:")
Employee mp2 =(Employee)bf2.Deserialize(steam2);
steam2.Close();
Response.Write(mp2.Empld);
Response.Write(mp2.EmpName);
Response.Write(mp2.NoSerialString);

这里介绍了几种方式之间的序列化与反序列化之间的转换
首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象;
第一种将object转换为string对象,这种比较简单没有什么可谈的;

相关文章:

C#序列化与反序列化详解

在我们深入探时C#序列化和反序列化&#xff0c;之前我们先要明白什么是序列化&#xff0c;它又称串行化&#xff0c;是.ET运行时环境用来支持用户定义 类型的流化的机制。序列化就是把一个对象保存到一个文件或数据库字段中去&#xff0c;反序列化就是在适当的时候把这个文件再…...

如何在k8s的Java服务镜像(Linux)中设置中文字体

问题描述&#xff1a;服务是基于springboot的Java服务&#xff0c;在项目上是通过Maven的谷歌插件打包&#xff0c;再由k8s部署的。k8s的镜像就是一个Java服务&#xff0c;Java服务用到了中文字体。 解决这个问题首先需要搞定镜像字体的问题。有很多类似的解决方案&#xff0c;…...

CT 扫描的 3D 图像分类-预测肺炎的存在

介绍 此示例将展示构建 3D 卷积神经网络 (CNN) 所需的步骤,以预测计算机断层扫描 (CT) 扫描中是否存在病毒性肺炎。2D CNN 通常用于处理 RGB 图像(3 通道)。3D CNN 就是 3D 的等价物:它以 3D 体积或一系列 2D 帧(例如 CT 扫描中的切片)作为输入,3D CNN 是学习体积数据表…...

整合管理案例题分析

本文摘自江山老师文档 五个过程 制定项目章程 1.没有写项目章程&#xff0c;没有颁布 2.项目经理自己颁布项目章程 3.项目经理修改项目章程 4.项目章程授权不够&#xff0c;项目经理没有权限&#xff0c;下面的人不听话 5.项目章程的内容不完整 制定项目管理计划 1.项目…...

mysql4

创建表并插入数据&#xff1a; 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 primary key name VARCHAR(50) 否 否 是 否 否 not null glass VARCHAR(50) 否 否 是 否 否 not nullsch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun …...

Python深度学习实战-基于tensorflow原生代码搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 前面两篇文章分别介绍了两种搭建神经网络模型的方法&#xff0c;一种是基于tensorflow的keras框架&#xff0c;另一种是继承父类自定义class类&#xff0c;本篇文章将编写原生代码搭建BP神经网络。 实现代码 import tensorflow as tf from sklearn.datasets import…...

PDF 文档处理:使用 Java 对比 PDF 找出内容差异

不论是在团队写作还是在个人工作中&#xff0c;PDF 文档往往会经过多次修订和更新。掌握 PDF 文档内容的变化对于管理文档有极大的帮助。通过对比 PDF 文档&#xff0c;用户可以快速找出文档增加、删除和修改的内容&#xff0c;更好地了解文档的演变过程&#xff0c;轻松地管理…...

压敏电阻有哪些原理?|深圳比创达电子EMC

压敏电阻是一种金属氧化物陶瓷半导体电阻器。它以氧化锌(ZnO)为基料&#xff0c;加入多种(一般5&#xff5e;10种)其它添加剂&#xff0c;经压制成坯体&#xff0c;高温烧结&#xff0c;成为具有晶界特性的多晶半导体陶瓷组件。氧化锌压敏电阻器的微观结构如下图1所示。 氧化锌…...

【计算机网络笔记】Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

IDEA 2023.2.2 使用 Scala 编译报错 No scalac found to compile scala sources

一、问题 scala: No scalac found to compile scala sources 官网 Bug 链接 二、临时解决方案 Incrementality Type 先变成 IDEA 类型 Please go to Settings > Build, Execution, Deployment > Compiler > Scala Compiler and change the Incrementality type to …...

C51--PWN-舵机控制

PWM开发sg90舵机 1、简介 PWM&#xff08;pulse width modulation&#xff09;是脉冲宽度调制缩写。 通过对一系列脉冲的宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;。对模拟信号电平进行数字编码&#xff0c;通过调节占空比的变化来…...

electron27+react18集成搭建跨平台应用|electron窗口多开

基于Electron27集成React18创建一个桌面端exe程序。 electron27-vite4-react18基于electron27结合vite4构建工具快速创建react18跨端应用实践。 版本列表 "vite": "^4.4.5" "react": "^18.2.0" "electron": "^27.0.1&…...

【k8s】kubeadm安装k8s集群

一、环境部署 master192.168.88.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.88.20docker、kubeadm、kubelet、kubectl、flannelnode02192.168.88.30docker、kubeadm、kubelet、kubectl、flannelhub.lp.com192.168.88.40 docker、docker-compose harbor-offli…...

三、虚拟机的迁移和删除

虚拟机的本质就是文件(放在文件夹的)。因此虚拟机的迁移很方便&#xff0c;可以把安装好的虚拟系统这个文件夹整体拷贝或者剪切到另外的位置使用。删除也很简单&#xff0c;使用vmware进行移除&#xff0c;再点菜单->从磁盘删除即可&#xff0c;或者手动删除虚拟系统对应的文…...

RabbitMQ的交换机(原理及代码实现)

1.交换机类型 Fanout Exchange&#xff08;扇形&#xff09;Direct Exchange&#xff08;直连&#xff09;opic Exchange&#xff08;主题&#xff09;Headers Exchange&#xff08;头部&#xff09; 2.Fanout Exchange 2.1 简介 Fanout 扇形的&#xff0c;散开的&#xff1…...

【C++进阶】pair容器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…...

Linux--进程等待

1.什么是进程等待 1.通过系统调用wait/waitid,来对子进程进行进行检测和回收的功能。 2.为什么有进程等待 1.对于每个进程来说&#xff0c;如果子进程终止&#xff0c;父进程没有停止&#xff0c;就会形成僵尸进程&#xff0c;导致内存泄露&#xff0c;为了防止僵尸进程的形成…...

VMware CentOS 虚拟机扩容

参考文章&#xff1a; VMware中centos磁盘扩容 - 简书 看这篇文章进行操作&#xff01;扩展根分区报错&#xff0c;xfs_growfs 提示 / is not a mounted XFS filesystem-CSDN博客 [rootnode001 ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/…...

CentOS 编译安装 nginx

CentOS 编译安装 nginx 修改 yum 源地址为 阿里云 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum makecache升级内核和软件 yum -y update安装常用软件和依赖 yum -y install gcc gcc-c make cmake zlib zlib-devel openss…...

学习笔记-MongoDB(命令增删改查,聚合,权限管理,索引,java使用)

基础概念 1 什么是mogodb&#xff1f; MongoDB 是一个基于分布式文件/文档存储的数据库&#xff0c;由 C 编写&#xff0c;可以为 Web 应用提供可扩展、高性能、易部署的数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库中功…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...