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

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

<1>

把“对象”转换为“字节序列”的过程称为对象的序列化。     把“字节序列”恢复为“对象”的过程称为对象的反序列化。

序列化

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Runtime.Serialization.Formatters.Binary;namespace 序列化与反序列化{    //序列化就是将对象转换成二进制    //反序列化就是将二进制转换成对象    //序列化与反序列化的作用就是:数据传输。     //我们在网络中数据传输的时候仅仅有二进制这个形态是能够被传输的。也就是说我们无论在网络中传输什么内容,都会先把你要传输的内容序列化成二进制的数据,对方接收到的相同就是一个二进制的数据。它须要再对这个二进制的数据进行反序列化成一个对象。    //我们要序列化一个类。第一步就要将类标记为能够被序列化的。用[Serializable]keyword。

仅仅有被[Serializable]标记的类创建出来的对象才干被序列化 [Serializable] //这个[Serializable]的作用是:指示一个类能够序列化。无法继承此类。 public class Person { public string Name { get; set; } public int Age{get;set;} public char Gender{get;set;} public Person() { } public Person(string name, int age, char gender) { this.Name = name; this.Age = age; this.Gender = gender; } } class Program { static void Main(string[] args) { //如今我们要将p这个对象,传输给对方的电脑。如今没有对方的电脑。那我就在自己的电脑上模拟一下:如今通过一个流将p这个对象转换成二进制,写到我的桌面上。然后我们再将这个二进制文件在通过反序列化成一个对象 Person p = new Person("雪辉", 25, '女'); using (FileStream stream = new FileStream(@"C:\Users\凡斌\Desktop\11.txt", System.IO.FileMode.OpenOrCreate, FileAccess.Write)) { //開始序列化对象。

開始序列化对象须要一个类 BinaryFormatter bf = new BinaryFormatter(); //public void Serialize(Stream serializationStream, object graph); 这个Serialize方法的第一个參数:是对象要序列化成的流文件。第二个參数是:要序列化的对象 bf.Serialize(stream, p); } Console.WriteLine("序列化完成"); } } }

反序列化

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Runtime.Serialization.Formatters.Binary;namespace 序列化与反序列化{    [Serializable]    public class Person    {        public string Name { get; set; }        public int Age { get; set; }        public char Gender { get; set; }    }    class Program    {        static void Main(string[] args)        {            //如今我们再将刚刚写到桌面的二进制流文件11.txt通过反序列化成一个对象            using (FileStream stream2 = new FileStream(@"C:\Users\凡斌\Desktop\11.txt", FileMode.Open, FileAccess.Read))            {                BinaryFormatter bf2 = new BinaryFormatter();                //public object Deserialize(Stream serializationStream);这个Deserialize方法的參数是:要反序列化的二进制流文件。它的返回值是一个object 全部我们要将这个object强转成Person类型。                Person p2=(Person) bf2.Deserialize(stream2);                Console.WriteLine("方序列化成功");                Console.WriteLine(p2.Name); //输出:雪辉                Console.ReadKey();            }        }    }}

序列化

序列化将此类的一个实例序列化为一个文件:【MyFile.bin  这个文件是把obj对象序列化后持久化存储的文件】MyObject obj = new MyObject(); obj.n1 = 1; obj.n2 = 24; obj.str = "一些字符串"; IFormatter formatter = new BinaryFormatter(); Stream MyStream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None); formatter.Serialize(MyStream, obj); stream.Close();

反序列化

反序列化这里说的是将一个MyFile.bin文件通过反序列化,转换成一个obj对象【filestream 读取这个文件流,然后用.net的序列化器反序列化成对象】IFormatter formatter = new BinaryFormatter(); Stream MyStream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read); MyObject obj = (MyObject) formatter.Deserialize(MyStream); stream.Close();

xml

将此类的实例序列化成一个Xml文件XmlSerializer ser = new XmlSerializer(obj.GetType());  ser.Serialize(new FileStream(@"users.xml", FileMode.Create), obj); 反序列化 XmlSerializer serializer = new XmlSerializer(Type.GetType("MyObject"));  MyObject my=(MyObject)serializer.Deserialize(new FileStream(@"users.xml",FileMode.Open));

序列化DataTable

主要是为了实现下次启动项目的时候能读取上次保存的对象信息。通俗点就是把一个对象保存起来。在特别的时候在把这个还原出来。在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化。

今天涉及到的主要是XML序列化,就DataTable的内容序列化保存。

///         /// DataTable序列化        ///         /// 须要序列化的DataTable        /// 路径        public void Serializer(DataTable dt,string path)        {            XmlSerializer serializer = new XmlSerializer(typeof(System.Data.DataTable));            System.Xml.XmlWriter writer= System.Xml.XmlWriter.Create(path);            serializer.Serialize(writer, dt);        }         //反序列化        private void InitData(string filePath)        {            XmlSerializer serializer = new XmlSerializer(typeof(System.Data.DataTable));            FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None);            DataTable dt = (DataTable)serializer.Deserialize(fs);            for (int i = 0; i < dt.Rows.Count; i++)            {                int j = dgvDeviceInfo.Rows.Add();                dgvDeviceInfo.Rows[j].SetValues(dt.Rows[i]["设备ID"].ToString(),                    dt.Rows[i]["序号"].ToString(),                    dt.Rows[i]["设备名称"].ToString(),                    dt.Rows[i]["编号"].ToString(),                    dt.Rows[i]["连接信息"].ToString(),                    dt.Rows[i]["备注"].ToString(),                    dt.Rows[i]["TagID"].ToString());            }        }



版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/yxwkf/p/4854783.html

你可能感兴趣的文章
React之特点及常见用法
查看>>
【WEB前端经验之谈】时间一年半,或沉淀、或从零开始。
查看>>
优云软件助阵GOPS·2017全球运维大会北京站
查看>>
linux 装mysql的方法和步骤
查看>>
poj3667(线段树区间合并&区间查询)
查看>>
51nod1241(连续上升子序列)
查看>>
SqlSerch 查找不到数据
查看>>
集合相关概念
查看>>
Memcache 统计分析!
查看>>
(Python第四天)字符串
查看>>
个人介绍
查看>>
使用python动态特性时,让pycharm自动补全
查看>>
MySQL数据库免安装版配置
查看>>
你必知必会的SQL面试题
查看>>
html5 Canvas绘制时钟以及绘制运动的圆
查看>>
Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
查看>>
JavaScript空判断
查看>>
洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
查看>>
python timeit
查看>>
Wireless Network 并查集
查看>>