C#通过序列化的方式存读类、结构、数组等为二进制文件

C#实现文件二进制存储(附完整源码) 阅读详情

平常我们使用文件存储程序数据时,一般需要将数据转换为文本等存储,等到需要使用的时候再从文件读取,然后重新构建类或结构或数组等对象。这样的转换和重建即浪费了时间效率不够高又导致容易出错,其实最近由于研究二进制文件的存取,我找到了序列化存取的方法。

序列化存取可以做到类对象、结构、数组等内存实体整体保存为二进制的文件,而不需转换,读取的时候,通过反序列化直接从文件构建对象,而不需要重新通过转换而来的数据构建,这样既节省了转换时间,运行速度又比较快。

简要说明一下,序列化主要是通过实现System.Runtime.Serialization.IFormatter接口的System.Runtime.Serialization.Formatters.Binary.BinaryFormatter类来实现的,其中的void  Serialize(Streamst, object ob)来实现序列化,这个函数就可以将object对象ob序列化为二进制流输入给Stream流st,这个方法有重载,具体看MSDN,但对于我们只想简单序列化,这样写也就够了。object Deserialize(Stream st)这个方法可以实现反序列化,从给定的Stream流st中反序列化出一个object对象,只需强制转换为目标对象就可以了。

为了说明问题,新建了一个示例工程(winForm程序),就一个界面,实现一个类的存和取如下(如果要序列化存储结构和数组只需要将Person对象换成相应对象即可,另外设计器自动生成的代码没有贴出来):

(程序调试截图)

(存储的二进制文件在VS中打开的截图)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace 序列化的二进制文件存取
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        /// <summary>
        /// 存储文件位置
        /// </summary>
        public static string savePath = "序列化存储文件.data";//指定存储在程序启动文件夹下的"序列化存储文件.data"内

        /// <summary>
        /// 存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button_Save_Click(object sender, EventArgs e)
        {
            //新建Person类对象
            Person newPerson = new Person();
            newPerson.name = textBox_name.Text;
            newPerson.age = Convert.ToInt32(textBox_age.Text);
            newPerson.grade = Convert.ToInt32(textBox_grade.Text);

            //这个对象用于序列化对象
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter binaryFormatter
                = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            ////或者用这个接口创建实例也可以
            //System.Runtime.Serialization.IFormatter binaryFormatter
            //    = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

            ////序列化person对象newPerson,先转化为二进制再存为文件
            //System.IO.MemoryStream ms = new System.IO.MemoryStream();
            //binaryFormatter.Serialize(ms, newPerson);
            //byte[] buffer = ms.GetBuffer();
            //System.IO.Stream st = new System.IO.FileStream(savePath, System.IO.FileMode.Create);
            //st.Write(buffer, 0, buffer.Length);
            //st.Close();

            //序列化person对象newPerson并存为文件
            System.IO.Stream st = new System.IO.FileStream(savePath, System.IO.FileMode.Create);//新建文件流
            binaryFormatter.Serialize(st, newPerson);//序列化类对象,并输入流
            st.Close();            
        }

        /// <summary>
        /// 取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button_Read_Click(object sender, EventArgs e)
        {
            //这个对象用于反序列化对象
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter binaryFormatter
                = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

            //浏览存储的对象文件
            OpenFileDialog op=new OpenFileDialog(){Filter="PerSon类文件(*.data)|*.data",InitialDirectory=Application.StartupPath};
            op.ShowDialog();

            if (System.IO.File.Exist(op.FileName))//如果浏览到文件
            {
                System.IO.Stream st = new System.IO.FileStream(op.FileName, System.IO.FileMode.Open);//指向数据文件的二进制流
                Person per = (Person)binaryFormatter.Deserialize(st);//反序列化,得到的是一个object对象,需要强制转换
                textBox_Show.Text = per.ToString();//显示对象信息
                st.Close();
            }
            else
                textBox_Show.Text = "没有相关文件!";
        }
    }

    /// <summary>
    /// 类示例
    /// </summary>
    [Serializable]//加上这个属性后此类创建的对象才能被序列化
    class Person
    {
        public string name { set; get; }
        public int age { set; get; }
        public int grade { set; get; }
        public override string ToString()
        {
            return "名字:" + name.ToString() + "\r\n年龄:" + age.ToString() + "\r\n年级:" + grade.ToString();
        }
    }
}


 

C# 数组与序列化 C# 数组与序列化C# 数组与序列化C# 数组与序列化C# 数组与序列化C# 数组与序列化C# 数组与序列化C# 数组与序列化 立即下载

相关推荐

南大计算机2024保研笔试:编译原理等5门专业课考点分布与408复习避坑指南

本文详细解析了南京大学计算机2024保研笔试的考点分布与复习策略,重点突出编译原理(占比28%-32%)和离散数学的特色考核。提供跨课程复习方法、真题题型分析及高效备考建议,帮助考生突破传统408框架,应对南大独特的命题风格。

weixin_29304985的博客 345

C#中的序列化

序列化是什么:         序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。序列化分为两大部分:序列 化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化 就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求 有恢复数据的对象实例。          通俗的

区块链领域填坑的java程序猿 1493

导数在工程与AI中的12个实战应用解析

导数作为数学中的基本概念,本质是描述变化率的工具,其核心价值在于将非线性问题局部线性化处理。从原理上看,通过极限过程捕捉函数瞬时变化特性,使工程师能精确控制系统动态行为,帮助科学家量化自然规律变化速率。在技术实现层面,现代符号计算(如Mathematica)、数值计算(如MATLAB)和自动微分(如PyTorch)工具链的发展,大幅提升了导数计算的效率与精度。典型应用场景涵盖机械控制(如ABS防抱死系统)、金融工程(如期权希腊值计算)、医疗影像(如Canny边缘检测)等领域。特别在机器学习中,反向传播算法依

weixin_35509395的博客 317

C#读取、保存二进制数据文件

C#读取、保存二进制数据文件

Python的专栏 1万+

腾讯滑块验证码collect参数逆向与JSVMP对抗实战

本文深入解析腾讯滑块验证码collect参数的逆向过程与JSVMP虚拟机对抗技术。通过详细的环境搭建、抓包分析和JSVMP逆向技巧,揭示collect参数的生成逻辑与加密流程,并提供完整的模拟实现方案和常见问题排查方法,助力开发者突破腾讯天御验证码的防护机制。

weixin_29009501的博客 1578

【YOLOv11】006、YOLOv11数据增强策略:Mosaic、MixUp等增强技术原理解析

摘要:YOLOv11在产线缺陷检测中遇到小尺寸瑕疵漏检问题,暴露了训练数据过于"干净"的缺陷。数据增强的核心是提升模型泛化能力,而非简单扩充数据。Mosaic增强通过多图拼接迫使模型处理多尺度目标,需注意边界框裁剪细节;MixUp通过线性插值使决策边界更平滑,但需避免类别冲突。自适应增强策略应随训练进度动态调整强度。实际应用中,需针对小目标、类别不平衡等场景调整增强参数,并确保验证与推理流程一致。数据增强应针对性解决具体问题,而非盲目尝试组合。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 366

C#实现文件二进制存储

private static BinaryFormatter Transfer = new BinaryFormatter(); public int BinaryFileSav() { //-----二进制文件写入并存储 saveFileDialog1.Filter = "数据文件(

优秀技术文章收录 7836

杰理接入第三方升级协议OTA教程

本教程介绍了使用dual_bank_updata_api.h接口接入第三方协议进行固件升级的方法。主要内容包括:INI配置要求(需启用双备份并强制4K对齐)、7个核心API接口功能说明及参数详解(初始化、空间检查、数据写入、校验等)、标准升级流程步骤(初始化→检查→写入→校验→引导→清理)。特别强调了4K对齐配置的重要性以避免数据丢失,并提供了被动升级流程图。该方案支持用户自定义协议接入,需严格按照流程调用接口完成升级。

qq_42014563的博客 1431

C#托管类型与非托管类型的字节数组序列化

C#托管类型与非托管类型的字节数组序列化

qq_55895529的博客 1138

MiniQMT国债逆回购策略Python代码全解析

通过本文的介绍,我们不仅学习了如何在MiniQMT平台上使用Python编写国债逆回购策略,还对策略的逻辑构建、代码实现以及风险管理有了深入的了解。国债逆回购策略是一种适合初学者的低风险投资方式,希望本文能帮助你在量化交易的道路上迈出坚实的一步。

木头大左的博客 1919

基于生存结局(生存分析/COX回归)的中介效应分析

① 建立观察变量OVB和中介变量MVB的回归模型(注意:这里根据mediation包的介绍,需要构建的是probit模型,而不是logist回归模型,网上有很多的代码用的logistic回归,结果自己跑的时候发现报错,我在这里陷了很久;为了方便演示,我们生成了一个协变量(Age)、一个连续型观察变量(liaOVC)、一个二分类观察变量(OVB)、一个连续型中介变量(MVC)、一个二分类中介变量(MVB)以及最后的结局变量(生存时间[time],生存结局[stats])。

m0_61863309的博客 1万+

C# 如何将数据序列化到本地 数组 对象 等等

1、将需要保存的数据生成json 添加引用: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Web.Extensions.dll 生成json: public string ToJSON(object obj) { J

Coder----Allen----Coder 3354

数学与纳米技术:微观世界的数学描述

《数学与纳米技术:微观世界的数学描述》 关键词:纳米技术、数学模型、微观世界、物理现象、计算模拟 摘要:本文探讨了数学在纳米技术领域的应用,从数学基础回顾、纳米技术引论,到物理现象与

AI天才研究院 1532

C# json反序列化 对象中嵌套数组 (转载)

看图: 这里可以看到是二层嵌套!!使用C#如何实现?? 思路:使用list集合实现 → 建立类 → list集合 → 微软的 Newtonsoft.Json (一款.NET中开源的Json序列化和反序列化) sonXMText类 using System; using System.Collections.Generic; using System.Li...

weixin_30824277的博客 1405

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# - 序列化

序列化Serialize&DeSerialize 序列化就是将C#的类型、对象序列化为字节流,反序列化则是反其道而行,将字节数据反转成C#类型。序列化的作用主要在于传输数据,而字节数据的格式是各种程序都可以通用的传输形式。C#类型默认不能被序列化,除非在类型上使用Serializable特性(Serializable在System命名空间中被定义),以表明这是一个可以被序列化的类型。但字...

weixin_34202952的博客 365

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# 将数据存为二进制数据文件

FileStream file = new FileStream(SaveFilePath + "net_data.dat", FileMode.Append);//以追加的形式打开文件 file.Write(recvdata, 0, recvdata.Length);//写入byte[]型数据 file.Flush(); file.Close();

零阶简正波的博客 3104

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C#序列化

文章目录C# 序列化二进制XmlJson测试案例 C# 序列化 二进制 //二进制序列化保存至 public static void BinarySaveTo<T>(T data, string pathName) { FileStream fileStream = new FileStream(pathName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); BinaryFormatter binary

万阁 451

C# 序列化与反序列化

序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有json、xml、文件等,下面就逐个讲下这三种序列化的方法。 一、序列化为json C#中用于对象和json相互转换的原生类有两个:DataContractJsonSerializer和JavaScriptSerializer,其中JavaScriptSer

风雨无阻,执着追求!!! 952

C#保存二进制文件到本地,并进行加载

直接写了变量和对应的函数,需要的名词空间自己引用一下 string path = "D:/Works/DEMO/Hands/Assets/StreamingAssets/"; string Leftpath = "D:/Works/DEMO/Hands/Assets/StreamingAssets/LeftHand.bytes"; public static byte[] currentFra...

Exclaiming的博客 3661

C# Json数组序列化和反序列总结

1、创建json数组,例: JArray arrFile = new JArray(); arrFile.Add(new JObject() { new JProperty("FilePath",jArray[i]["FilePath"].ToString()),//文件路径 ...

deni2000的博客 1951

c#数据库存取二进制文件

利用ADO.NET中的OleDbConnection\OleDbCommand   可以方便的对SQL   Server中的二进制文件进行更新操作,下面是详细的代码演示             演示环境:         数据库机器名 :s_test     登陆名 :sa     密码 :7890     数据库名     db_test         下面建立一个表:     create ...

飛翔 494

C# 序列化对象到文件和从文件发序列化对象

                                                            序列化对象和发序列化对象      程序应用过程中,经常会把对象序列化到到文件中,以保存数据。然后再从文件中反序列化出来。具体应用如下:     1,构造一个类: 注意一定要加上[Serializable],表示可序列。     [Serializable]    class P...

Nick_H 的专栏 3204

c#序列化总结

(一)序列化方式 .net framework的类库中提供了三个可以用于序列化和反序列化的类,分别为BinaryFormatter、SoapFormatter和XmlSerializer。 BinaryFormatter的命名空间为System.Runtime.Serialization.Formatters.Binary,位于程序集mscorlib.dll中。 SoapFormatter的命名空间为System.Runtime.Serialization.Formatters.Soap,位于程序集...

一技旁身 2384

C#结构体Struct的序列化Serialize和反序列化unserialize为字符串

C#结构体Struct的序列化Serialize和反序列化unserialize为字符串 201 关于对象如何序列化和反序列化为字符串的问题,已经解决了: 但是上次是遇到了,去序列化结构体,会出错,所以以为C#中,不支持结构体的序列化呢。  后来无意间得知,C#好像也是能实现结构体的序列化的,所以现在去搞清楚,如何实现。 【解决过程】  1.网上搜了一堆,找到很多谈

yangjun_cool的专栏 8318

C#序列化与反序列化

序列化是将对象或对象图转换成字节流的过程。反序列化是将字节流转换回对象图的过程。

qq_43565708的博客 4285

C#之你懂得的序列化/反序列化

前言:写此文章一方面是为了巩固对序列化的认识,另一方面是因为本人最近在面试,面试中被问到“为什么要序列化”。虽然一直在使用,自己也反复的提到序列化,可至于说为什么要序列化,还真的没想过,所以本文就这样产生了。 序列化是将一个对象转换成一个字节流的过程。反序列化是将一个字节流转换回对象的过程。在对象和字节流之间转换是很有用的一个机制。(当然这个还不能回答它的实际用处) 举点例子: 应用程序...

weixin_30235225的博客 208
上一篇: 如何在C#中使用C++类(非托管)和C函数
下一篇: C#以二进制方式存取文件
柏林春天
博客等级 码龄17年 25粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值