C# 二进制序列化和反序列化示例

news/2024/12/22 20:31:45/

.NET框架提供了两种种串行化的方式:

1、是使用BinaryFormatter进行串行化;

2、使用XmlSerializer进行串行化。

        第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。

        序列化意思指的是把对象的当前状态进行持久化,一个对象的状态在面向对象的程序中是由属性表示的,所以序列化类的时候是从属性读取值以某种格式保存下来,而类的成员函数不会被序列化,.net存在几种默认提供的序列化,二进制序列化,xml和json序列化会序列化所有的实例共有属性。

        这里简单介绍:BinaryFormatter以二进制格式序列化和反序列化对象。

        BinaryFormatte序列化:将对象转化成二进制,BinaryFormatte反序列化就是将二进制转化为对象;

        命名空间: System.Runtime.Serialization.Formatters;

        最常用的两个方法:

                Deserialize(Stream)     将指定的流反序列化成对象

                Serialize(Stream, Object)     将对象序列化到给定的流

        两个常用的属性:

                Serializable     表示可以被序列化

                NonSerializable     屏蔽被序列化

**************************************************************************************************************

 简单示例:

namespace Model
{[Serializable]public class Config{    [NonSerialized]  // 表示下面这个age字段不进行序列化private int age{ get; set; }public string Language { get; set; }public bool IsAutoBackup { get; set; }public int BackupTimeForHour { get; set; }public string LastTimeRestoreDBFile { get; set; }public DateTime? LastAutoBackupDateTime { get; set;}public bool IsSupportHis { get; set; }//序列化 fileName:文件地址public void SaveTo(string fileName){using (MemoryStream ms = new MemoryStream()){BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(ms, this);File.WriteAllBytes(fileName, ms.ToArray());}}//反序列化public static DSConfig LoadFromFile(string fileName){try{if (!File.Exists(fileName))return null;else{byte[] buff = File.ReadAllBytes(fileName);using (MemoryStream ms = new MemoryStream(buff)){BinaryFormatter formatter = new BinaryFormatter();return (DSConfig)formatter.Deserialize(ms);}}}catch (Exception ex){}return null;}}
}

调用示例

private const string CONFIGNAME = "b1b4af87-1870-11e9-a31b-8cec4b4fece0.cfg";
public static string ConfigName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Viewer",CONFIGNAME);
Config config = Config.LoadFromFile(ConfigName);
//对Config类里面参数赋值后保存
Config.SaveTo(ConfigName);

************************************************************************************************************** 

BinaryFormatte序列化,示例二:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace Binaryformats
{internal class Program{private static void Main(string[] args){Person p = new Person();p.Sex = 1;p.Age = 21;p.Name = "dfr";byte[] serBytes = BinaryFormat.Serialize(p); //序列化Person pp = (Person) BinaryFormat.Deserialize(serBytes); //反序列化,object类转化成自己定义的Console.WriteLine(pp.Name);Console.ReadLine();}[Serializable]private class Person //用Serializable做了标记,标识可以被序列化{private int _age;[NonSerialized] private string _name; //用NonSerialized做了标记,标识该字段屏蔽序列化private int _sex;public string Name{get { return _name; }set { _name = value; }}public int Sex{get { return _sex; }set { _sex = value; }}public int Age{get { return _sex; }set { _sex = value; }}}}public class BinaryFormat{public static byte[] Serialize(Object Urobject) //序列化 返回byte[]类型{BinaryFormatter bf = new BinaryFormatter();MemoryStream memory = new MemoryStream();//使用using 可以避免忘记释放bf.Serialize(memory, Urobject);byte[] bytes = memory.GetBuffer();memory.Close();return bytes;//或者采用方法:using (MemoryStream ms = new MemoryStream(buff)){}}public static object Deserialize(byte[] bytes) //反序列化,返回object类型的{BinaryFormatter bf = new BinaryFormatter();MemoryStream memory = new MemoryStream(bytes);object ss = bf.Deserialize(memory);memory.Close();return ss;}}
}

**************************************************************************************************************


http://www.ppmy.cn/news/364223.html

相关文章

一文搞清楚 Docker 镜像、容器、仓库

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接:体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收…

边缘检测笔记

边缘是什么? 图像的边缘是指图像局部区域中亮度变化明显的部分,边缘位于像素的灰度值产生突变的地方。 边缘的正负之分:由暗到亮为正,由亮变暗为负。 图像的高频信号和低频信号 简单理解为,图像中高频分量&#xff08…

基于Python的接口自动化测试框架

目录 前言: 项目背景 工具选择 框架思路 第三方库介绍 代码实现 不足之处 前言: Python是一种流行的编程语言,Python的易学性和易用性使得它成为编写接口自动化测试框架的理想选择。在Python中,有许多库可以帮助我们执行HTTP请求…

如何看待分层测试?

分层测试分了个寂寞? 分层测试这个风吹了好多年,不分层都不好意思说自己是专业测试。各互联网公司更是对此乐此不疲,测试架构、测试平台,搞了一套又一套,然而。。。 理想总是丰满,现实总是骨干&#xff0…

pyspark安装教程

pyspark安装教程 一、Windows下配置pyspark环境1.1 JDK下载安装1.2 Scala下载安装1.3 spark下载安装1.4 Hadoop下载安装1.5 pyspark下载安装 二、pyspark原理简介 一、Windows下配置pyspark环境 在python中使用pyspark并不是单纯的导入pyspark包就可以实现的,而是需…

NR-5G 工具网站

https://5g-tools.com/

nrf52的坑

愿世界没有坑! 1、keil程序无法下载 使用官方最新的sdk即可。 2、官方例程无法引脚复位 官方例程的工程配置存在问题。修改c/c和asm的define的配置为“BOARD_PCA10040 BSP_DEFINES_ONLY CONFIG_GPIO_AS_PINRESET FLOAT_ABI_SOFT NRF52810_XXAA NRF52_PAN_74 __H…

5G NR 频段及带宽

频段 在5G NR中,定义了两种频段范围,FR1和FR2,FR1表示低频频段,FR2表示毫米波高频频段。具体FR1和FR2表示的频段范围如下表所示 工作带宽 工作带宽是指在NR中有编号的、实际规定了上下频率边界的一段频带。在FR1和FR2频段范围内…