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

news2024/12/28 5:54:42

在这里插入图片描述
在我们深入探时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对象,这种比较简单没有什么可谈的;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1138301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试总结之消息中间件

RabbitMQ的消息如何实现路由 RabbitMQ是一个基于AMQP协议实现的分布式消息中间件&#xff0c;AMQP具体的工作机制是生产者将消息发送到RabbitMQ Broker上的Exchange交换机上&#xff0c;Exchange交换机将收到的消息根据路由规则发给绑定的队列&#xff08;Queue&#xff09;&am…

不同网段的IP怎么互通

最近在整理工作的时候发现一个不同网段无法互通的问题&#xff0c;就是我们大家熟知的一级路由和二级路由无法互通的问题。由于需要记录整个过程的完整性&#xff0c;这里也需要详细记录下整个过程&#xff0c;明白的人不用看&#xff0c;可以直接跳过&#xff0c;到解决方法去…

传智书城源码+课程设计文档基于JSP+Servlet实现

下载地址: https://juzhendongli.store/commodity/details/19 包括源码参考论文

IDEA 断点高阶

一、按钮介绍 1.1 补充 返回断点处&#xff1a; 设置debug配置&#xff1a; 二、增加/切换debugger视图 三、window快捷键 所在行处&#xff1a; CtrlF8断点属性编辑&#xff1a; CtrlShiftF8 四、一些常用的高级功能 4.1 查看对象内存-Attach memory agent 1.勾选Atta…

PHP与mysql数据库交互

PHP与mysql数据库交互 文章目录 PHP与mysql数据库交互方法速查建立与Mysql链接捕获连接错误SQL语句的执行SQL 错误SQL语句执行结果集对象方法速查 案例 方法速查 函数名 作用 mysqli_connect() 与MySQL 数据库建立连接。 mysqli_close() 关闭与MYSQL 数据库建…

git合并错分支还原技巧

如果合并错了&#xff0c;但是还没有push&#xff0c;还原的简单粗暴的方式就是把合并后的分支删了。 本文主要讲的是git合并错分支并且已经push了的还原方式 比如&#xff1a;开发分支future_1&#xff0c;合并到项目组共同使用的分支develop上了&#xff0c;并且已经push了&…

Java实现SQL分页

在日常开发需要对数据进行分页&#xff0c;配置如下 <!-- baomidou --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency> 在控…

8.稳定性专题

1. anr https://code84.com/303466.html 一句话&#xff0c;规定的时间没有干完要干的事&#xff0c;就会发生anrsystem_anr场景 input 5sservice 前台20s 后台60scontentprivider超市 比较少见 原因 主线程耗时 复杂layout iobinder对端block子线程同步锁blockbinder被占满导…

ROS自学笔记十五:URDF工具

要使用工具之前&#xff0c;首先需要安装&#xff0c;安装命令: sudo apt install liburdfdom-tools 1.check_urdf 语法检查 在ROS中&#xff0c;你可以使用.check_urdf命令行工具来对URDF&#xff08;Unified Robot Description Format&#xff09;文件进行语法检查和验证。…

【广州华锐视点】VR飞行员驾驶模拟实训系统

VR飞行员驾驶模拟实训系统是一种基于虚拟现实技术的航空装备仿真测试技术&#xff0c;可以用于飞行员、乘务员和机务人员的训练。该系统可以模拟真实的飞行环境&#xff0c;包括天气、地形、飞机性能等&#xff0c;使被试者能够在虚拟环境中进行飞行操作&#xff0c;从而提高其…

DAY35 435. 无重叠区间 + 763.划分字母区间 + 56. 合并区间

435. 无重叠区间 题目要求&#xff1a;给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 示例 1: 输入: [ […

Nginx 的配置文件(负载均衡,反向代理)

Nginx可以配置代理多台服务器&#xff0c;当一台服务器宕机之后&#xff0c;仍能保持系统可用。 cmd查找端口是否使用&#xff1a;netstat -ano Nginx出现403 forbidden #解决办法&#xff1a;修改web目录的读写权限&#xff0c;或者是把nginx的启动用户改成目录的所属用户&…

题目 1059: 二级C语言-等差数列(python详解)——练气四层后期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

京东平台数据分析:2023年9月京东空气净化器行业品牌销售排行榜

鲸参谋监测的京东平台9月份空气净化器市场销售数据已出炉&#xff01; 9月份&#xff0c;空气净化器的销售同比上年增长。根据鲸参谋平台的数据显示&#xff0c;今年9月&#xff0c;京东平台空气净化器的销量将近15万&#xff0c;同比增长约1%&#xff1b;销售额将近2亿元&…

身份证读卡器Qt语言实现Linux系统开发集成

Linux系统用Qt开发身份证读卡器示例&#xff0c;后面是Cdemo源码&#xff1a; 编译平台&#xff1a; 麒麟V10&#xff08;SP1&#xff09;&#xff0c;amd构架&#xff0c;Intel i7-10700 CPU Qt版本&#xff1a; Qt Creator 4.11.0&#xff0c;Based on Qt 5.12.12&#xff0…

CTF-Crypto 第二天-DES加密算法原理学习

文章目录 DES算法简介DES算法流程迭代加密费斯妥函数&#xff08;F函数&#xff09;密钥调度 混淆与扩散 DES算法简介 数据加密标准&#xff08;Data Encryption Standard&#xff0c;缩写DES&#xff09;是一种对称加密算法&#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…

linux配置jdk环境变量的三种方法

在Linux系统中&#xff0c;配置JDK环境变量是非常重要的&#xff0c;它可以让你在终端中直接使用Java命令&#xff0c;同时也能够确保你的Java应用程序能够正常运行。下面将介绍三种常用的方法来配置JDK环境变量。 方法一&#xff1a;使用/etc/profile文件 1. 打开终端&#…

TWAS模型数据*.wgt.RDat查看及导入R

TWAS模型数据*.wgt.RDat查看及导入R 1 数据导入R load(“./SLC7A8.wgt.RDat”) as.data.frame(snps) -> snp snp %>% head()V1 V2 V3 V4 V5 V6 1 12 rs10747759 0 55683634 C T 2 12 rs2293409 0 55684180 A C 3 12 rs1048103 0 55684405 C …

.DS_Store泄露

.DS_Store泄露 1.简介2.发掘和利用方式 1.简介 .DS_Store文件是苹果操作系统&#xff08;如Mac OS&#xff09;中的隐藏文件&#xff0c;它保存了文件夹的自定义属性、图标布局和其他元数据信息。通常&#xff0c;这些文件用于记录文件夹中的视图选项和布局设置。 就文件本身…