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

如何在k8s的Java服务镜像(Linux)中设置中文字体
问题描述:服务是基于springboot的Java服务,在项目上是通过Maven的谷歌插件打包,再由k8s部署的。k8s的镜像就是一个Java服务,Java服务用到了中文字体。 解决这个问题首先需要搞定镜像字体的问题。有很多类似的解决方案,…...
CT 扫描的 3D 图像分类-预测肺炎的存在
介绍 此示例将展示构建 3D 卷积神经网络 (CNN) 所需的步骤,以预测计算机断层扫描 (CT) 扫描中是否存在病毒性肺炎。2D CNN 通常用于处理 RGB 图像(3 通道)。3D CNN 就是 3D 的等价物:它以 3D 体积或一系列 2D 帧(例如 CT 扫描中的切片)作为输入,3D CNN 是学习体积数据表…...
整合管理案例题分析
本文摘自江山老师文档 五个过程 制定项目章程 1.没有写项目章程,没有颁布 2.项目经理自己颁布项目章程 3.项目经理修改项目章程 4.项目章程授权不够,项目经理没有权限,下面的人不听话 5.项目章程的内容不完整 制定项目管理计划 1.项目…...
mysql4
创建表并插入数据: 字段名 数据类型 主键 外键 非空 唯一 自增 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神经网络实现分类任务(附源码和实现效果)
实现功能 前面两篇文章分别介绍了两种搭建神经网络模型的方法,一种是基于tensorflow的keras框架,另一种是继承父类自定义class类,本篇文章将编写原生代码搭建BP神经网络。 实现代码 import tensorflow as tf from sklearn.datasets import…...

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

压敏电阻有哪些原理?|深圳比创达电子EMC
压敏电阻是一种金属氧化物陶瓷半导体电阻器。它以氧化锌(ZnO)为基料,加入多种(一般5~10种)其它添加剂,经压制成坯体,高温烧结,成为具有晶界特性的多晶半导体陶瓷组件。氧化锌压敏电阻器的微观结构如下图1所示。 氧化锌…...

【计算机网络笔记】Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...

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(pulse width modulation)是脉冲宽度调制缩写。 通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值)。对模拟信号电平进行数字编码,通过调节占空比的变化来…...

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…...

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

RabbitMQ的交换机(原理及代码实现)
1.交换机类型 Fanout Exchange(扇形)Direct Exchange(直连)opic Exchange(主题)Headers Exchange(头部) 2.Fanout Exchange 2.1 简介 Fanout 扇形的,散开的࿱…...

【C++进阶】pair容器
👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…...

Linux--进程等待
1.什么是进程等待 1.通过系统调用wait/waitid,来对子进程进行进行检测和回收的功能。 2.为什么有进程等待 1.对于每个进程来说,如果子进程终止,父进程没有停止,就会形成僵尸进程,导致内存泄露,为了防止僵尸进程的形成…...
VMware CentOS 虚拟机扩容
参考文章: VMware中centos磁盘扩容 - 简书 看这篇文章进行操作!扩展根分区报错,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? MongoDB 是一个基于分布式文件/文档存储的数据库,由 C 编写,可以为 Web 应用提供可扩展、高性能、易部署的数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...