序列化和反序列化

序列化和反序列化

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

<1>

http://wenku.baidu.com/view/f15ac821dd36a32d737581e0.html

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

序列化

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的内容序列化保存。

        /// <summary>
        /// DataTable序列化
        /// </summary>
        /// <param name="dt">须要序列化的DataTable</param>
        /// <param name="path">路径</param>
        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://javaforall.net/116808.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VMware虚拟机安装DOS6.22

    VMware虚拟机安装DOS6.22

    2022年3月12日
    34
  • matlab画三维图如何更改颜色,MATLAB画三维图像「建议收藏」

    matlab画三维图如何更改颜色,MATLAB画三维图像「建议收藏」姓名:刘肖珊学号:19021210919【嵌牛导读】:matlab是一款功能强大的编程软件,三维图像常用,文章介绍matlab如何画三维图像【嵌牛鼻子】:MATLAB、三维图【嵌牛提问】:matlab如何画三维图像?【嵌牛正文】:当我们学习surface命令时,已经看到了三维作图的一些端倪。在matlab中我么可以调用mesh(x,y,z)函数来产生三维图像。首先,我们用z=cos(x)sin(…

    2022年10月11日
    0
  • 虚函数实现原理

    虚函数实现原理前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不…

    2022年7月14日
    14
  • 基于深度学习的车辆检测系统(MATLAB代码,含GUI界面)

    基于深度学习的车辆检测系统(MATLAB代码,含GUI界面)摘要:当前深度学习在目标检测领域的影响日益显著,本文主要基于深度学习的目标检测算法实现车辆检测,为大家介绍如何利用MATLAB设计一个车辆检测系统的软件,通过自行搭建YOLO网络并利用自定义的数据集进行训练、验证模型,最终实现系统可选取图片或视频进行检测、标注,以及结果的实时显示和保存。其中,GUI界面利用最新的MATLABAPP设计工具开发设计完成,算法部分选择时下实用的YOLOv2/v3网络,通过BDD100K数据集进行训练、测试检测器效果。本文提供项目所有涉及到的程序代码、数据集等文件,完整资源。

    2022年10月15日
    0
  • fpga的spi的编程_UASP协议

    fpga的spi的编程_UASP协议什么是SPI协议?如何用FPGA实现?

    2022年10月16日
    0
  • C语言输出所有的水仙花数

    C语言输出所有的水仙花数输出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字立方之和等于该数本身。例如,153是一个水仙花数,因为153=1³+5³+3³解题思路:水仙花数的解题思路是把给出的某个三位数的个位、十位、百位分别拆分,并求其立方和。程序能正常运行并准确输出“水仙花数”。定义i为水仙花数,运用for循环for(❶i=100;❷i<=999;❸i++)先执行❶,再执行❷判断条件是否满足,满足执行下列花括号,最后执行❸,一次循环结束;再执行❷判断条件是否满足,满足执行下列花括号,最后

    2022年7月24日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号