序列化和反序列化

序列化和反序列化

大家好,又见面了,我是全栈君,今天给大家准备了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.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.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());
            }
        }



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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116808.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • [ubuntu] 查看端口占用[通俗易懂]

    [ubuntu] 查看端口占用[通俗易懂]netstat-ap|grep2200

  • Apache POI使用详解[通俗易懂]

    Apache POI使用详解[通俗易懂]一:简介开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache的poi,另一个是JavaExcelApachePOI简介是用Java编写的免费开源的跨平台的JavaAPI,ApachePOI提供API给Java程式对MicrosoftOffice(Excel、WORD、PowerPoint、Visio等

  • JS创建和存储 cookie的一些方法

    JS创建和存储 cookie的一些方法

    2021年10月31日
  • C++求最大公约数和最小公倍数

    C++求最大公约数和最小公倍数方法一:辗转相除法   用"较大数"除以"较小数",再用"较小数"除以"第一余数",再用“第一余数”除以 “第二余数",   如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#include&a

  • linux 卸载jdk_linux环境变量文件

    linux 卸载jdk_linux环境变量文件1、检查系统jdk版本:2、检测jdk安装包:3、卸载openjdk:一开始选择了直接删除openjdk文件夹后面使用了这种简单明了快捷yumremoveopenjdk4、安装新的jdk:首先到jdk官网上下载你想要的jdk版本,下载到指定的文件夹下,我一般放在/usr/lib/java。官方下载越来越慢,可以考虑一些云服务商的镜像,如华为云:wgethttps://repo.huaweicloud.com/java/jdk/8u192-b12/jdk-8u192-lin

发表回复

您的电子邮箱地址不会被公开。

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