序列化和反序列化

序列化和反序列化

大家好,又见面了,我是全栈君,今天给大家准备了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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python 3Des 加密

    python 3Des 加密

    2021年11月29日
    52
  • mysql索引类型和索引方式

    mysql索引类型和索引方式1.什么是索引在MySQL中,索引(index)也叫做“键(key)”,它是存储引擎用于快速找到记录的一种数据结构。2.索引的分类在MySQL中,通常我们所指的索引类型,有以下几种:主键索引(PRIMARYKEY)也简称主键。它可以提高查询效率,并提供唯一性约束。一张表中只能有一个主键。被标志为自动增长的字段一定是主键,但主键不一定是自动增长。一般把主键定义在无意义的字段上(如:编号)…

    2022年5月2日
    76
  • Spring AOP 切面@Around注解的具体使用

    Spring AOP 切面@Around注解的具体使用@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务。比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@Around注解来实现;再比如我们想在执行方法时动态修改参数值等类似功能的注解还有@Before等等,用到了SpringAOP切面思想,SpringAOP常用于拦截器、事务、日志、权限验…

    2022年7月15日
    40
  • [干货]手把手教你写一个安卓app

    摘要:最近有很多小伙伴在后台留言:AndroidStudio。我想大家是想写一个手机app吧,前面已经分享了在QT上如何写一个安卓蓝牙app,虽然qt可以做app但是比起AndroidStudio还是差很多了!这里我们介绍一种快速入门的方法来制作一款app,就算你是零基础小白没有学习过java语言,我相信看完我的文章半天时间你也会做一个安卓app。本文针对初学者,大佬勿喷啊!1.创建HelloWorld项目这里我就不介绍如何安装这个AndroidStudio软件了,网上有很多教程或者去B站找对应

    2022年4月8日
    36
  • 排序二叉树及其Java实现[通俗易懂]

    排序二叉树及其Java实现[通俗易懂]定义排序二叉树的定义也是递归定义的,需要满足:(1)若它的左子树不为空,则左子树上所有节点的值要均小于根节点的值;(2)若它的右子树不为空,则右子树上所有节点的值要均大于根节点的值;(3)左、右子树也分别是排序二叉树如下图,对于排序二叉树,若按中序遍历就可以得到由小到大的有序序列。创建创建排序二叉树的步骤就是不断像排序二叉树中添加新节点(p)的过程:(1)以根节

    2022年7月25日
    13
  • webstorm 19 激活码【2021最新】

    (webstorm 19 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月27日
    70

发表回复

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

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