博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象序列化与反序列化
阅读量:5102 次
发布时间:2019-06-13

本文共 2487 字,大约阅读时间需要 8 分钟。

  • 对象序列化是将对象(比如Person对象)转换为二进制数据,反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。
  • BinaryFormatter类有两个方法:

–    void Serialize(Stream stream, object graph)对象graph序列化到stream中

–    object Deserialize(Stream stream)将对象从stream中反序列化,返回值为反序列化得到的对象

  • 不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化。
  • 反序列的项目中必须有同样的类,否则不能反序列化。

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.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace 序列化反序列化

{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnSerialize_Click(object sender, EventArgs e)

        {
            List<string> list = new List<string>();
            list.Add("美国与中国");
            list.Add("历代经济变革得失");
            list.Add("抉择时刻");

            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenWrite(@"C:\Users\LeiXin\Desktop\1.dat"))
            {
                //序列化
                bf.Serialize(stream, list);
            }
            MessageBox.Show("序列化成功");
        }

        private void btnDeserialize_Click(object sender, EventArgs e)

        {
            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenRead(@"C:\Users\LeiXin\Desktop\1.dat"))
            {
                //反序列化
                object obj = bf.Deserialize(stream);
                List<string> lists = (List<string>)obj;
                foreach (var list in lists)
                {
                    MessageBox.Show(list);
                }
            }
        }

        private void btnObjectSerialize_Click(object sender, EventArgs e)

        {
            Person p1 = new Person();
            p1.Name = "老布什";
            p1.Age = 80;
            p1.Id = 1;

            Person p2 = new Person();

            p2.Name = "小布什";
            p2.Age = 50;
            p2.Id = 2;
            p2.Parent = p1;

            BinaryFormatter bf = new BinaryFormatter();

            using (Stream stream = File.OpenWrite(@"C:\Users\LeiXin\Desktop\i1.dat"))
            {
                bf.Serialize(stream, p2);
                MessageBox.Show("对象序列化成功!");
            }
        }

        private void btnObjectDeseralize_Click(object sender, EventArgs e)

        {
            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenRead(@"C:\Users\LeiXin\Desktop\i1.dat"))
            {
                Person p=(Person)bf.Deserialize(stream);
                MessageBox.Show(p.Parent.Name);
            }
        }
    }
    [Serializable]//要序列化,必须在该类的前面标记[Serializable]
    class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public Person Parent { get; set; }
        public Dog Pet { get; set; }
    }
    [Serializable]//不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化。

    class Dog

    {
        public string Name { get; set; }
    }
}

转载于:https://www.cnblogs.com/leixin-nation/p/3477402.html

你可能感兴趣的文章
python 描点画圆
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
pycharm 如何设置方法调用字体颜色
查看>>
VUE源码解析心得
查看>>
random模
查看>>
RESTful
查看>>
第05课 Linux命令初探(一)
查看>>
Python中的音频和数字信号处理(DSP)
查看>>
委托的使用(转)
查看>>
uml第3次作业
查看>>
[Swift]LeetCode20. 有效的括号 | Valid Parentheses
查看>>
[Guitar self-practising] 【吉他练习王-节奏练习】曲目1 基本扫弦节奏练习
查看>>
计算机运算方法与机器指令
查看>>
[Algorithm] Delete a node from Binary Search Tree
查看>>
[Recompose] Pass a React Prop to a Stream in RxJS
查看>>
分治法--二分查找、乘方、斐波那契数
查看>>
利用CSS3 animation绘制动态卡通人物,无需使用JS代码
查看>>
Java Applet Reflection Type Confusion Remote Code Execution
查看>>
WordPress Cart66 Lite插件跨站请求伪造漏洞
查看>>