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

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

.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.lryc.cn/news/93444.html

相关文章:

  • 【CSS】文字扫光 | 渐变光
  • Overhaul Distillation(ICCV 2019)原理与代码解析
  • <Linux开发>驱动开发 -之-内核定时器与中断
  • 希尔贝壳邀您参加2023深圳国际人工智能展览会
  • 设计优质微信小程序的实用指南!
  • 大数据期末总结
  • selenium面试题总结
  • ⑧电子产品拆解分析-1拖4USB拓展坞
  • 月度精华汇总 | 最新XR行业资讯、场景案例、活动都在这一篇里啦!
  • Redis实战案例1-短信登录
  • 华为OD机试真题 JavaScript 实现【找终点】【2023 B卷 100分】,附详细解题思路
  • 详解数据仓库数据湖及湖仓一体
  • 基于注解切换、Hikari实现的SpringBoot动态数据源(支持JNDI)
  • Java中的动态链接VS操作系统动态链接
  • 深入理解Linux虚拟内存管理(七)
  • GSR II 智能速度辅助系统的型式认证和系统作为独立技术单元的型式认证测试流程和技术要求
  • 工厂方法模式(五)
  • 力扣笔记(每日随机一题)——最佳买卖股票时机含冷冻期
  • yolov5 6.1 关于 tensorrt 加速的使用以及问题说明
  • SVR(支持向量机)用法介绍
  • 是面试官放水,还是公司实在是太缺人?这都没挂,腾讯原来这么容易进···
  • 算法模板(5):数学(1):数学知识(1)
  • 电子行业 K 公司对接 Nexperia EDI 项目案例
  • chatgpt赋能python:Python如何将英文转化为中文的最佳方法
  • 知道这些英文文档翻译的方式吗
  • 供应链安全
  • 华硕天选4原装Windows11系统带ASUSRECOVERY恢复工厂模式安装
  • 数据库期末复习(8)并发控制
  • 一文说透:低代码开发平台和零代码平台区别是什么?
  • 4.将图神经网络应用于大规模图数据(Cluster-GCN)