C#序列化与反序列化

一、简介

C#序列化和反序列化主要通过BinaryFormatter对象实现,BinaryFormatter类提供了

反序列化方法Deserialize(Stream serializationStream),

序列化方法Serialize(Stream serializationStream, object graph),

它主要跟FileStream对象结合使用,使用它有几个注意地方:

        1.引用

        跟File类一样,我们要对它进行引用才可使用

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

        2.对序列化的类进行声明

        对需要序列化的类进行声明,否则报错,比如要对一个Stu类进行序列化和反序列化,在其上面添加[Serialize]即可。

  [Serializable]
    public class Stu

        3.结合使用的对象FileStream使用后要关闭。

FileStream fs = new FileStream(Path,FileMode.Open)
                BinaryFormatter bf = new BinaryFormatter();
                cardInfos = (CardInfo[])bf.Deserialize(fs);
                fs.Close();

        调用它的Close();

二、下面简单的实现功能代码

        主要是对Stu对象进行序列化和反序列化,Stu属性有Id、Name、Sex、Age

1.窗体布局,显示信息主要是ListView控件

2.代码实现

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

namespace FileSerializeANDDeSerialization
{
    public partial class Form1 : Form
    {   
        //stu的 list
        List<Stu> stus = new List<Stu>();
        //文件夹路径
        string DirPath = Application.StartupPath + "\\config";
        //文件路径
        string FilePath = Application.StartupPath + "\\config\\stu.cfg";

        public Form1()
        {
            InitializeComponent();           
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                //判断文件夹是否存在
                if (!Directory.Exists(DirPath))
                {
                    Directory.CreateDirectory(DirPath);
                }
                //判断文件是否存在
                if (File.Exists(FilePath))
                {
                    //声明一个FileStream 打开文件
                    FileStream fs = new FileStream(FilePath, FileMode.Open);
                    //声明序列化对象
                    BinaryFormatter bf = new BinaryFormatter();
                    //对文件进行反序列化,存放到stus
                    stus = (List<Stu>)bf.Deserialize(fs);
                    //展示信息
                    ShowList(stus);
                    //关闭流
                    fs.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        /// <summary>
        /// 展示信息
        /// </summary>
        /// <param name="stus">信息对象</param>
        private void ShowList(List<Stu> stus)
        {
            listView1.Items.Clear();
            foreach (Stu item in stus)
            {
                ListViewItem listView = new ListViewItem(item.Id);
                listView.SubItems.Add(item.Name);
                listView.SubItems.Add(item.Sex);
                listView.SubItems.Add(item.Age);
                listView1.Items.Add(listView);
            }
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            //判断内容是否为空
            if (tbAge.Text != "" && tbID.Text != "" && tbName.Text != "" && tbSex.Text != "")
            {
                //声明一个对象存放信息
                Stu stu = new Stu(tbID.Text, tbName.Text, tbSex.Text, tbAge.Text);
                stus.Add(stu);
                //声明一个FileStream 创建,存在就覆盖
                FileStream fs = new FileStream(FilePath, FileMode.Create);
                //声明序列化对象
                BinaryFormatter bf = new BinaryFormatter();
                //将stus对象进行序列化,存放到文件
                bf.Serialize(fs, stus);
                //关闭流
                fs.Close();
                //刷新显示列表
                ShowList(stus);
                MessageBox.Show("添加信息完成");
                tbID.Text = tbAge.Text = tbName.Text = tbSex.Text = "";
            }
            else
            {
                MessageBox.Show("内容不能留空");
            }
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("是否关闭软件!", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                this.Close();
            }
        }
    }
    [Serializable]
    public class Stu
    {
        public string Id { get; set; }
        public string Sex { get; set; }
        public string Name { get; set; }
        public string Age { get; set; }
        public Stu(string id, string name, string sex, string age)
        {
            this.Id = id;
            this.Sex = sex;
            this.Name = name;
            this.Age = age;
        }
    }
}

3.效果

 

 

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值