Serialize对象二进制序列化与反序列化存储参数代替ini文件

news2024/11/23 11:02:01

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在C#中,可以使用System.Runtime.Serialization命名空间中的类来进行序列化操作。

以下是在C#中使用序列化的基本步骤:

  1. 创建一个可序列化的类,并标记该类和需要序列化的属性或字段,使用[Serializable]特性进行标记。

    [Serializable]  
    public class Person  
    {  
        public int ID { get; set; }  
        public string Name { get; set; }  
    }

  2. 创建一个BinaryFormatter对象,并使用它将对象序列化为二进制格式。

BinaryFormatter formatter = new BinaryFormatter();  
using (FileStream stream = new FileStream("person.bin", FileMode.Create))  
{  
    formatter.Serialize(stream, person);  
}

上述代码将person对象序列化为二进制格式,并保存到名为"person.bin"的文件中。您可以根据需要更改文件名和路径。

        3.反序列化对象,使用BinaryFormatter将二进制数据转换回为对象。

BinaryFormatter formatter = new BinaryFormatter();  
using (FileStream stream = new FileStream("person.bin", FileMode.Open))  
{  
    Person deserializedPerson = (Person)formatter.Deserialize(stream);  
}

上述代码将从名为"person.bin"的文件中反序列化Person对象。

请注意,序列化和反序列化是在内存中进行的操作,因此如果您的对象很大或很复杂,可能会导致性能问题。此外,反序列化过程可能会引发异常,例如如果文件损坏或格式不正确。因此,在使用序列化时,应该注意错误处理和异常情况。

实际使用例程

 

存储配置,相应的代码实例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }
        //参考代码讲解 https://www.bilibili.com/video/BV16V411V7D3/?spm_id_from=333.999.0.0&vd_source=e821a225c7ba4a7b85e5aa6d013ac92e

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //实例化对象
                person p = new person();
                p.name = textBox1.Text;
                p.age = Convert.ToInt32(textBox2.Text);
                p.pic = pictureBox1.Image;
                
                p.tags.Add(textBox1.Text);
                p.tags.Add(textBox2.Text);
                p.tags.Add("kkk");

                //序列化对象
                string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, p.name + ".db");

                using(FileStream fs = new FileStream(filePath,FileMode.Create,FileAccess.Write)) {
                    BinaryFormatter binFormat = new BinaryFormatter(); //创建二进制序列化器
                    binFormat.Serialize(fs, p);  //将对象序列化到流中
                }
                MessageBox.Show("序列化成功!", "提示");
            }catch (Exception ex)
            {
                MessageBox.Show("序列化保存出错" + ex.ToString());
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory; //设置初始目录
            openFileDialog.Multiselect = false;
            openFileDialog.Filter = "PNG图像(*.png)|*.png|JPG图像(*.jpg)|*.jpg"; //文件过滤
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Load(openFileDialog.FileName);  
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.InitialDirectory= AppDomain.CurrentDomain.BaseDirectory; 
            openFileDialog.Multiselect = false;
            openFileDialog.Filter = "Person对象(*.db)|*.db";//文件筛选器

            if( openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string filePath = openFileDialog.FileName;
                using(FileStream fs = new FileStream(filePath,FileMode.Open,FileAccess.Read))
                {
                    try
                    {
                        BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
                        person p = (person)binFormat.Deserialize(fs);
                        textBox1.Text = p.name;
                        textBox2.Text = p.age.ToString();
                        pictureBox1.Image = p.pic;

                        this.Text = p.tags.Count.ToString() + " ";

                        for( int i = 0; i < p.tags.Count; i++ )
                        {
                            this.Text += p.tags[i].ToString()+"  "; 
                        }
                        
                        

                    }catch( Exception ex )
                    {
                        MessageBox.Show("反序列化失败"+ex.Message,"提示");
                       
                    }
                }
            }

        }
    }
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    [Serializable] //必须有此关键词才能序列化存储、加载
    public class person
    {
        public string name { get; set; }    
        public int age { get; set; }
        public Image pic { get; set; }

        public List<string> tags { get; set; } = new List<string>();
    }
}

特此记录

anlog

2023年8月22日

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

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

相关文章

deeplabv3+源码之慢慢解析26 第五章utils文件夹(1)ext_transforms.py--2个翻转类和ExtCompose类

系列文章目录&#xff08;更新中&#xff09; 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之慢…

Maven解析

目录 Maven的概念 Pom 项目坐标 仓库 Maven环境搭建 安装jdk 配置maven 配置本地仓库地址 配置阿里云 maven 镜像仓库&#xff0c;下载速度更快 在idea中配置maven ​编辑 pom中名词解释 Maven命令 Maven的概念 Maven 是 Apache 软件基金会的一个开源项目,是一个…

PySide6学习笔记--基础环境的安装配置

PySide6介绍 QT官方发布Qt6.0之后&#xff0c;紧接着于2020年12月10日发布了PySide 6&#xff0c;对应C版的Qt6。从PySide6开始&#xff0c;PySide的命名也会与Qt的大版本号保持一致。需要注意的是使用PySide6开发的程序在默认情况下&#xff0c;不兼容Windows7系统&#xff0c…

QT 使用图表

目录 1、概念 1.1 坐标轴-QAbstractAxis 1.2 系列-QAbstractSeries 1.3 图例-Legend 1.4 图表-QChart 1.5 视图-QChartView 2、 QT 折线图 2.1 Qt 折线图介绍 2.2 Qt 折线图实现 Qt 图表是专门用来数据可视化的控件 Qt 图表包含折线、饼图、棒图、散点图、范围图等。…

英文翻译照片怎么做?掌握这个方法轻松翻译

在现代社会中&#xff0c;英文已经成为了一种全球性的语言&#xff0c;因此&#xff0c;我们在阅读文章或者查看图片时&#xff0c;经常会遇到英文的内容。为了更好地理解这些英文内容&#xff0c;我们需要将其翻译成中文。在本文中&#xff0c;我将探讨图片中英文内容翻译的方…

mysql通过binlog日志恢复误删数据

1、先查看binlog功能是否开启 show variables like %log_bin%;log_bin为ON说明可以使用binlog恢复&#xff0c;如果为OFF说明没有开启binlog。 2、删除部分数据做测试 3、查找binlog文件位置 show variables like %datadir%;cd /var/lib/mysqlls -l删除数据时间是在文件154与…

2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较

文章目录 React&#xff1a;构建用户界面的首选Vue&#xff1a;简单优雅的前端框架Angular&#xff1a;Google支持的全面框架Node.js&#xff1a;服务器端的JavaScript运行环境比较不同框架的优势与劣势React&#xff1a;Vue&#xff1a;Angular&#xff1a;Node.js&#xff1a…

数字档案长期保存EEP文件管理和四性检测系统工具

数字(电子)档案EEP封装包工具软件&#xff08;nhdeep&#xff09;&#xff0c;可以生成和导入长期保存标准格式的EEP封装文件&#xff0c;进行目录查看和条目信息查看&#xff0c;以及原文文件的查看。并提供对长期保存EEP封装文件的四性检测功&#xff0c;能保障封装文件质量。…

IP地址SSL证书

在许多企业用例中&#xff0c;公司需要SSL证书作为IP地址。公司使用IP地址通过Internet或Intranet访问各种类型的应用程序。根据组织策略&#xff0c;您希望使用SSL证书保护IP地址。 在本文中&#xff0c;我将向您解释获取IP地址SSL证书的过程&#xff0c;以及哪种类型的SSL证…

三菱PLC与变频器之间无线通讯

在工业现场由PLC远程控制变频器的应用非常常见&#xff0c;如果挖沟布线不便或者变频器在移动设备上&#xff0c;那么采用无线通讯就是最佳方案。 这里我们选用最常用的三菱 FX2N PLC和三菱变频器为例&#xff0c;并结合日系plc专用无线通讯终端DTD435M来说明PLC与变频器之间的…

MySQL 运维篇+单机多实例多版本部署初始化缺少sys库概述

说明&#xff1a;本文讲述MySQL在单机多实例多版本部署情况下初始化后缺少sys库问题方案&#xff1a;初始化数据库前建议暂时将其他实例的Default options&#xff08;/etc/my.cnf等&#xff09;重命名结论&#xff1a;初始化新实例时即使指定相关参数也有可能会受到默认参数的…

浙江某半导体厂房配电室电气节点无线测温方案

摘 要&#xff1a;半导体被誉为“制造业的大脑”&#xff0c;在关系国家安全和国民经济命脉的主要行业和关键领域占据支配地位&#xff0c;是国民经济的重要支柱。 随着数字技术的发展和数字经济在国民经济中所占比重越来越高&#xff0c;半导体产业的重要性还会进一步提升。安…

chat聊天对话智能机器人Model大模型Platform大平台Data大数据支持

解决工作生活中遇到的任何问题&#xff0c;情感陪护&#xff0c;闲聊扯淡&#xff0c;无所不能。 图像描述生成&#xff08;Image Caption&#xff09;是一个融合计算机视觉、自然语言处理和机器学习的综合问题&#xff0c;它类似于翻译一幅图片为一段描述文字。该任务对于人类…

SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo)

乐观锁加注解Version后不需要手动进行加1操作。乐观锁是一种用于解决并发冲突的机制&#xff0c;在数据库中用于保护数据的一致性。Version注解是MyBatisPlus框架中的乐观锁注解&#xff0c;它会在更新数据时自动检查版本号是否一致&#xff0c;如果一致则进行更新操作&#xf…

混合App开发可以怎么玩?

随着越来越多的软件都是以saas或者云端的形式提供&#xff0c;因此&#xff0c;混合App的开发占比越来越大&#xff0c;大厂们纷纷都转向此类的开发。最近看到一些文章&#xff0c;混合App的开发&#xff0c;还能用计算机之父的那套理论--冯诺依曼结构来开开脑洞。 本篇文章&a…

多线程——学习笔记 1

目录 多线程的了解多线程并行和并发的区别Java程序运行原理多线程程序实现的方式1.继承Thread2.实现Runnable 多线程(实现Runnable的原理&#xff09;实现多线程两种方式的区别匿名内部类实现线程的两种方式获取线程名字和设置名字获取当前线程的对象——hread.currentThread()…

allegro env 文件路径

很多人说在cadence安装路径里修改env文件不生效&#xff0c;或者在安装目录里找不到env文件路径。 原因可能是 用户环境变量中的HOME路径修改导致的&#xff0c;allegro会抓取HOME变量定义的路径中的env文件。所以你如果要修改env文件&#xff0c;最好看看HOME路径&#xff0c…

窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器

上一篇文章《如何用窗口函数实现排名计算》中小编为大家介绍了窗口函数在排名计算场景中的应用&#xff0c;但实际上窗口函数除了可以进行单行计算&#xff0c;还可以在每行上打开一个指定大小的计算窗口&#xff0c;这个计算窗口可以由SQL中的语句具体指定&#xff0c;大到整个…

LTMC S/4HANA 2022 – 迁移您的数据

翻译一篇&#xff0c;估计很少人用过这个LTMC功能&#xff0c;更不用说&#xff0c;LTMOM了。一个还没开始用已经被弃用的事务代码&#xff1a; 在这篇博文中&#xff0c;我将解释如何在 S/4HANA 2022 版本中通过“迁移您的数据”应用程序逐步执行数据迁移。如您所知&#xff0…

UE4/5Niagara粒子特效之Niagara_Particles官方案例:2.4->3.2

之前的案例 UE4/5Niagara粒子特效之Niagara_Particles官方案例&#xff1a;1.1-&#xff1e;1.4_多方通行8的博客-CSDN博客 UE4/5Niagara粒子特效之Niagara_Particles官方案例&#xff1a;1.5-&#xff1e;2.3_多方通行8的博客-CSDN博客 2.4 Location Events 这次的项目和之…