C#对象序列化

C#对象序列化详解 C#中的序列化主要是通过一个格式化工具获取某个自定义类型对象中的所有数据成员并写入传入的一个文件流中,或者从文件流对象中               解析出某个自定义类型对象中的所有数据成员并赋值到一个该类型对象中。从而实现了用二进制流来处理对象的存储问题。               其中C#里的格式化工具可以分为BinaryFormatter(二进制格式化工具)、SoapFormatter 阅读详情

转自:http://www.csharpwin.com/dotnetspace/12740r6571.shtml

要让一个对象支持.Net序列化服务,用户必须为每一个关联的类加上[Serializable]特性。如果类中有些成员不适合参与序列化(比如:密码字段),可以在这些域前加上[NonSerialized]特性。

  C#支持三种序列化格式:二进制格式(使用BinaryFormatter序列化器)、SOAP格式(使用SoapFormatter序列化器)、XML格式(使用XmlSerializer序列化器)。这三种序列化器的区别如下:

  二进制格式可序列化一个类型的所有可序列化字段,不管它是公共字段还是私有字段。SOAP格式和XML格式仅能序列化公共字段或拥有公共属性的私有字段,未通过属性公开的私有字段将被忽略。

  使用二进制格式序列化时,它不仅是将对象的字段数据进行持久化,也持久化每个类型的完全限定名称和定义程序集的完整名称(包括包称、版本、公钥标记、区域性),这些数据使得在进行二进制格式反序列化时亦会进行类型检查。SOAP格式序列化通过使用XML命名空间来持久化原始程序集信息。而XML格式序列化不会保存完整的类型名称或程序集信息。这便利XML数据表现形式更有终端开放性。如果希望尽可能延伸持久化对象图的使用范围时,SOAP格式和XML格式是理想选择。

  BinaryFormatter和SoapFormatter类型通过实现IFormatter和IRemotingFormatter接口实现序列化。

  IFormatter接口定义了核心的Serialize和Deserialize方法用于序列化和反序列化。

  IRemotingFormatter接口重载了Serialize和Deserialize方法,使风格更适合分布式持久化。

  示例代码:

  
using System; using System.Collections.Generic; using System.Text; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; using System.IO; using System.Xml.Serialization; namespace CollectionSerialize { class Program { static void Main( string [] args) { // 文件名称 string fileName = " Programmers.dat " ; // 创建Programmer列表,并添加对象 List < Programmer > list = new List < Programmer > (); list.Add( new Programmer( " Coder1 " , false , " C " )); list.Add( new Programmer( " Coder2 " , false , " C++ " )); list.Add( new Programmer( " Coder3 " , false , " Java " )); // 创建文件流 Stream fStream = null ; fStream = FileReset(fStream, fileName); // 使用二进制序列化器 BinaryFormatter binFormat = new BinaryFormatter(); // 将list序列化到文件中 binFormat.Serialize(fStream, list); // 清空列表 list.Clear(); // 重置流位置 fStream.Position = 0 ; // 反序列化,注意要将结果转型 list = (List < Programmer > )binFormat.Deserialize(fStream); // 输出 Print(list); fStream = FileReset(fStream, fileName); // 使用XML序列化 // 注意使用此构造器时必须在第一个参数传入序列化的类型,第二个参数传入序列化所涉及的相关类型 XmlSerializer xmlFormat = new XmlSerializer( typeof (List < Programmer > ), new Type[] { typeof (Programmer), typeof (Person) }); // 反序列化 xmlFormat.Serialize(fStream, list); list.Clear(); fStream.Position = 0 ; // 反序列化,注意要将结果转型 list = (List < Programmer > )xmlFormat.Deserialize(fStream); Print(list); fStream = FileReset(fStream, fileName); // 使用SOAP序列化 SoapFormatter soapFormat = new SoapFormatter(); // 序列化,Soap不能序列化泛型对象,所以只能指定序列化一个Programmer对象 soapFormat.Serialize(fStream, list[ 0 ]); list.Clear(); fStream.Position = 0 ; // 反序列化 list.Add((Programmer)soapFormat.Deserialize(fStream)); Print(list); fStream.Close(); Console.ReadKey(); } // 输出程序员列表 static void Print(List < Programmer > list) { Console.WriteLine( " 程序员信息列表: " ); foreach (Programmer p in list) { Console.WriteLine( " 姓名:{0} 性别:{1} 编程语言:{2} " , p.Name, p.Sex.ToString(), p.Language); } } // 重置文件 static FileStream FileReset(Stream fStream, string fileName) { // 关闭文件流 if (fStream != null ) { fStream.Close(); } // 删除文件 File.Delete(fileName); // 新建文件流 return new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); } } [Serializable] // 必须添加序列化特性 public class Person { // 姓名 public string Name; // 性别 public bool Sex; // 必须提供无参构造器,否则XmlSerializer将出错 public Person() { } // 构造函数 public Person( string name, bool sex) { this .Name = name; this .Sex = sex; } } [Serializable] // 必须添加序列化特性 public class Programmer : Person { // 编程语言 public string Language; // 必须提供无参构造器,否则XmlSerializer将出错 public Programmer() { } // 构造函数 public Programmer( string name, bool sex, string language) : base (name, sex) { this .Language = language; } } }

  程序运行结果如下:

  需要注意的是:

  1. SoapFormatter不能序列化泛型对象。

  2. XmlSerializer的构造器需要传入序列化涉及的相关类型信息。

C#对象序列化反序列化保存与读取和对象直接保存与读取                 C#对象序列化反序列化保存与读取和对象直接保存与读取         基于WindowForm应用程序C#语言通过实际案例实现将对象保存到文件及从已保存的文件中读取对象(直接保存与读取、通过序列化与反序列化方式进行对象保存与读取) 首先展示界面效果图如下:                               添加Student类: using... 阅读详情

相关推荐

C# Serializable对象序列化

1、序列化定义:将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。 在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本 2、使用序列化的原因:将对象的状态保存...

qq_30725967的博客 695

再看序列化与反序列化

序列化就是将内存中的对象保存成可存或可传的形式。一般情况下,对象是根据类被实例化到托管堆上的,一旦进程退出,整个对象被释放掉,如果再次实例化类,所得的对象,与先前的对象状态是不一样的,为此,序列化就成为一个有效的解决方式。 下面先看一个例子: 新建一个WinForm项目,在Form1窗体上放两个Button,分别为Button1和Button2。 在Form1对应的cs代码中,引入下列命名空...

weixin_30896511的博客 106

C#对象序列化的完整指南

在C#编程中,对象序列化是一项重要的任务,它可以将对象转换为可传输或存储的格式,以便在不同的应用程序或平台之间进行交互。通过对象序列化,我们可以将对象保存到磁盘、数据库或网络流中,并在需要时还原成原始对象。通过对象序列化,我们可以方便地将对象保存到磁盘或传输到其他应用程序中,并在需要时还原成原始对象。在本文中,我将详细介绍C#对象序列化的基本概念、用法和示例代码。在上述示例中,我们创建了一个Person对象并设置其属性。通过以上示例,我们可以看到对象序列化和反序列化在C#中的基本用法和流程。

pytorchCode的博客 393

C# 序列化

一、 序列化的概念 序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候 把这个文件再转化成原来的对象使用。 需要分清楚的概念:对象的序列化而不是类的序列化。对象的序列化表明C#提供了将 运行中的对象(实时数据)写入到硬盘文件或者数据库中,此功能可以运用在需要保留 程序运行时状态信息的环境下。 使用序列化有两个最重要的原因: 1)一个原因是将对象的状态永久保存在存储媒体中,以便可以在以后重新创建精确的 副本; 2)另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。 前

weixin_50179860的博客 6214

C# 中单文件多对象序列化技术及应用

序列化,简单来说,就是将数据结构或对象状态转换为格式化的字节流,便于存储或网络传输。反序列化则是将这些字节流重新构建成原始数据结构或对象。序列化是将对象状态信息转换为可以存储或传输形式的过程,而反序列化则是将这些信息还原为原始对象的过程。在.NET中,序列化主要用于对象持久化、远程通信和数据传输。序列化允许对象以某种格式(例如XML或二进制)保存到磁盘或通过网络传输到远程位置,随后可以被重新构造为原始对象。

weixin_35829279的博客 923

C#对象序列化与反序列化

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。 SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的。 XML序列化:对象序列化之后的结果是XML形式的,通过XmlSerializer 类来实现的,这个类位于System.Xml.Serialization命名空间下。XML序列化不能序列化私有数据。

C#序列化与反序列化

一、序列号的概念 序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件在转化成原来的对象使用。对象的序列化不是类的序列化。对象的序列化表明C#提供了将运行的对象(实时数据)写入硬盘文件或数据库中,此功能可以运用在需要保留程序运行时状态信息的环境下。 二、使用序列化的两个重要的原因 第一个原因:是将对象的状态永久保存在存储媒体中,以便可以在以后重新创建精确的副本; 第二个原因:是通过值将对象从一个应用程序域发送到另一个应用程序域中。 前提是要将对象的声明为可以序列化。 三、最

weixin_47228553的博客 4762

ROS四旋翼无人机快速上手指南(4):阿木实验室PX4功能包飞行控制分析与讲解(重点章节)

成就更好的自己 这一章详细讲解一下阿木实验室(AMOV)的开源项目px4_command功能包,此功能包通过mavlink协议直接控制烧录px4固件的自驾仪,还融合了来自各个传感器的位姿,距离等信息,此外,功能包提供的接口向上对接应用层算法级的程序例如SLAM,kfc目标检测引导,路径规划等算法,因此,在整个无人机控制中起到了承上启下至关重要的作用。 用到的文件及工具包链接如下: AMOV实验室源码如下: https://gitee.com/theroadofengineers/px4_comman

The Road of Engineer 6168

C#中对象序列化方式整理

完成序列化的底层方法,要序列化的类继承使用序列化接口,实现其中的方法,从而完成序列化和反序列化。其定义是指根据对象的具体需求,自行定义对象如何转换为字节流(或其他格式)的过程,以及如何从字节流重新构建对象的过程。这种序列化方式通常用于复杂的数据结构或需要特殊处理的场景中。自定义序列化优点灵活性:自定义序列化允许开发者根据具体需求,灵活地定义对象的序列化和反序列化规则,而不受通用序列化框架的限制。性能优化:对于特定的数据结构,自定义序列化可以更高效地处理,减少不必要的资源消耗。安全性增强。

2501_90674644的博客 2119

强化学习Q值迭代的几何视角:从策略区域到快速收敛

在强化学习中,Q值迭代是求解最优策略的核心算法,其理论基础建立在贝尔曼不动点定理之上。该算法通过迭代更新Q函数,使其逐步逼近最优值函数。从几何视角看,整个Q函数空间可被视为一个高维流形,每个Q函数对应流形上的一个点,而贝尔曼最优算子则定义了流形上的变换轨迹。理解这一几何结构,特别是由策略超平面划分出的凸多面体区域,对于分析算法的收敛行为至关重要。在实际工程中,传统Q值迭代可能在高维或稀疏奖励环境下收敛缓慢,甚至陷入策略高原。通过引入策略区域缓存与自适应学习率等几何启发方法,可以更高效地导航策略空间,加速策略

weixin_30444111的博客 317

MicroPython ubluetooth 库详细介绍

MicroPython的ubluetooth库为蓝牙通信提供了强大的支持,使得开发者能够在MicroPython环境下轻松实现蓝牙设备之间的通信。其中ubluetooth库为MicroPython提供了强大的蓝牙通信功能,使得开发者能够轻松地在各种支持MicroPython的硬件平台上实现蓝牙设备之间的通信。它提供了一系列的函数和类,用于实现蓝牙设备的扫描、连接、数据传输等功能。- 上述代码中,首先创建了一个蓝牙服务和一个特征,然后可以通过read和write函数读取和写入特征值。# 处理连接成功事件。

m0_46311182的博客 1760

C#对象反序列化与对象序列化

C#对象反序列化与对象序列化 对象序列化的介绍 1、.net支持对象序列化的几种方式 二进制序列化  SOAP序列化  XML序列化 2、几种序列化的区别 二进制格式和SOAP格式可序列化一个类型的所有可序列化字段,不管       使用二进制方式的序列化与反序列化的代码 using System; using System.Collections.Generic; usi

GaraMaps的博客 1988

ADS学习笔记 1. 功率放大器设计

基于ADS2023 update2的学习笔记1.功率放大器设计

u014087103的博客 1万+

C#对象序列化、反序列化、保存、读取、对象直接保存、读取

基于WindowForm应用程序C#语言通过实际案例实现将对象保存到文件及从已保存的文件中读取对象(直接保存与读取、通过序列化与反序列化方式进行对象保存与读取) 添加Student类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WF_Serialize { /...

WarGames_dc的博客 7077

BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversarial Network(2018,妆容迁移)

论文下载地址:BeautyGAN | Proceedings of the 26th ACM international conference on Multimedia 目的:在实例级实现化妆图像和非化妆图像的妆容迁移 方法:全局域集损失和本地实例级损失合并到一个双输入/输出对抗生成网络。步骤:使用一对鉴别器将非化妆面传输到化妆域,鉴别器从域的真实样本中分辨出生成的图像。在域集迁移的基础上,采用基于不同人脸区域的像素级直方图损失来实现实例级迁移。为了保持人脸的一致性和消除伪影,在总体目标函数中加入了.

weixin_53965540的博客 663

VBA中如何使用Edge内核Browser?

在微软宣布停止对IE的支持后,许多使用VBA中Web Browser的用户遇到了困境,因为Web Browser使用的IE内核。然而微软并没有给出支持Edge的新版Web Browser,网上许多第三方的库也不够完善。经过调研,libEdge可以较好的和VBA集成,实现在Excel中打开Browser,甚至能够通过执行js代码,获取web页面的信息。项目需要WebView2Loader.dll和LibEdge.dll两个库,区分x86和x64版本。

金木AI 2396

C#序列化多个对象到单个文件

  特定的情况下,可能需要将多个对象保存到文件中。在网上找了一阵,没发现专门说这个问题的。在博问看到了一个相关的问题和回答,整理了一下。以下是我的一个简单实现: //测试用于保存的类   [Serializable] class TestToSerizable { public int i; public string b; ...

weixin_34082789的博客 1482

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

C#对象序列化、反序列化

必须添加引用:usingSystem.IO;usingSystem.Runtime.Serialization;usingSystem.Runtime.Serialization.Formatters.Binary;方法:#region对象序列化//////对象序列化//////任意对象

myshare2022的专栏 1620

2018安徽省青少年信息学奥林匹克(AHOI)初中组

12 种合法的排列分别为:1, 3, 2, 4, 2, 3, 1, 4, 3, 1, 4, 2, 3, 2, 4, 1, 1, 3, 4, 2, 2, 3,4,1,1,4,2,3, 2,4,1,3, 4,1,3,2, 4,2,3,1, 1,4,3,2, 2,4,3,1。分为 2 组,一组的队员实力值是{4, 5, 2, 3},一组是{-4, -3, -5},其中最小的组人数为 3,可以发现没有比 3 更优的分法了。[0, 1, 1, 2]同样不是合法的分组方案,因为出现了两个实力值为 1 的选手。

weixin_42358969的博客 1143

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C#中对象的序列化与反序列化

C#中对象的序列化与反序列化,是一项很常用的技术,对于对象的保存,传输等十分有用。 这里有两个很实用的序列化与反序列化的方法,是我从网友里的得到的,介绍给大家。 以下是要用到两个方法:         ///            ///  序列化为二进制字节数组          ///            ///  要序列化的对象           ///  字节数组      

Lucker's PowerSpace 1555

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# 如何实现对象序列化

本文介绍了C#中三种对象序列化方法:1)二进制序列化使用BinaryFormatter类,需标记[Serializable]属性;2)XML序列化通过XmlSerializer实现,可提高数据可读性;3)JSON序列化推荐使用Newtonsoft.Json库,支持格式化输出。每种方法都提供了序列化和反序列化的代码示例,以Person类为例演示了具体实现过程。

unicrom的博客 333

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C#对象(类)的序列化与反序列化

C#对象(类)的序列化与反序列化 public class Program { public static void Main(string[] args) { Student ss = new Student(); ss.Id = 0; ss.Name = "liang"; ss.Sex = "女"; ss.Qq = "676596050";

yanpingzaizai的博客 349
上一篇: WPF中的动画
下一篇: 优秀程序员的十个习惯
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值