12.序列化与反序列篇

1.对象序列化的介绍

1.NET支持对象序列化的几种方式

二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。

SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的。

XML序列化:对象序列化之后的结果是XML形式的,通过XmlSerializer 类来实现的,这个类位于System.Xml.Serialization命名空间下。XML序列化不能序列化私有数据。

2.几种序列化的区别

二进制格式和SOAP格式可序列化一个类型的所有可序列化字段,不管它是公共字段还是私有字段。XML格式仅能序列化公共字段或拥有公共属性的私有字段,未通过属性公开的私有字段将被忽略。

使用二进制格式序列化时,它不仅是将对象的字段数据进行持久化,也持久化每个类型的完全限定名称和定义程序集的完整名称(包括包称、版本、公钥标记、区域性),这些数据使得在进行二进制格式反序列化时亦会进行类型检查。SOAP格式序列化通过使用XML命名空间来持久化原始程序集信息。而XML格式序列化不会保存完整的类型名称或程序集信息。这便利XML数据表现形式更有终端开放性。如果希望尽可能延伸持久化对象图的使用范围时,SOAP格式和XML格式是理想选择。

3使用特性对序列化的控制

要让一个对象支持.Net序列化服务,用户必须为每一个关联的类加上[Serializable]特性。如果类中有些成员不适合参与序列化(比如:密码字段),可以在这些域前加上[NonSerialized]特性。

2.使用二进制序列化和反序列化代码事例

[Serializable]  //必须添加序列化特性

    public class Person

    {

        private string Name;//姓名

        private bool Sex;//性别,是否是男

        public Person(string name, bool sex)

        {

            this.Name = name;

            this.Sex = sex;

        }

        public override string ToString()

        {

            return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");

        }

    }

    [Serializable]  //必须添加序列化特性

    public class Programmer : Person

    {

        private string Language;//编程语言

        public Programmer(string name, bool sex, string language) : base(name, sex)

        {

            this.Language = language;

        }

        public override string ToString()

        {

            return base.ToString() + "\t编程语言:" + this.Language;

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            //创建Programmer列表,并添加对象

            List<Programmer> list = new List<Programmer>();

            list.Add(new Programmer("李志伟", true, "C#"));

            list.Add(new Programmer("Coder2", false, "C++"));

            list.Add(new Programmer("Coder3", true, "Java"));

            //使用二进制序列化对象

            string fileName = @"D:\users\lizw\桌面\Programmers.dat";//文件名称与路径

            Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);

            BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器

            binFormat.Serialize(fStream, list);

            //使用二进制反序列化对象

            list.Clear();//清空列表

            fStream.Position = 0;//重置流位置

            list = (List<Programmer>)binFormat.Deserialize(fStream);//反序列化对象

            foreach (Programmer p in list)

            {

                Console.WriteLine(p);

            }

            Console.Read();

        }

    }

(2)总结

SOAP序列化与二进制序列化的区别是:SOAP序列化不能序列化泛型类型。与二进制序列化一样在序列化时不需要向序列化器指定序列化对象的类型。而XML序列化需要向XML序列化器指定序列化对象的类型。

详细原创:http://www.cnblogs.com/yzenet/p/3622833.html

其他见解:http://www.cnblogs.com/xiaolifeidao/archive/2013/01/28/2879523.html

经典理解:http://jingyan.baidu.com/article/a681b0dec765473b184346d9.html

时间: 2024-08-11 07:39:23

12.序列化与反序列篇的相关文章

Newtonsoft.Json序列化和反序列

这里下载:http://www.newtonsoft.com/products/json/安装:   1.解压下载文件,得到Newtonsoft.Json.dll   2.在项目中添加引用.. 序列化和反序列在.net项目中: Product product = new Product();   product.Name = "Apple"; product.Expiry = new DateTime(2008, 12, 28); product.Price = 3.99M; prod

[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.NET中快带序列化和反序列化.最后介绍在使用.NET序列化JSON过程中的注意事项. 读前必备: A.泛型       [.net 面向对象编程基础]  (18) 泛型 B.LINQ使用  [.net 面向对象编程基础] (20) LINQ使用 1. 关于JSON JSON的全称是”JavaScrip

(转)Newtonsoft.Json序列化和反序列

这里下载:http://www.newtonsoft.com/products/json/安装:   1.解压下载文件,得到Newtonsoft.Json.dll   2.在项目中添加引用.. 序列化和反序列在.net项目中: Product product = new Product();   product.Name = "Apple"; product.Expiry = new DateTime(2008, 12, 28); product.Price = 3.99M; prod

Newtonsoft.Json序列化和反序列之javascriptConvert.SerializeObject,DeserializeObject,JsonWriter,JsonReader

这里下载:http://www.newtonsoft.com/products/json/安装:   1.解压下载文件,得到Newtonsoft.Json.dll   2.在项目中添加引用.. javascriptConvert.SerializeObject 序列化和反序列在.net项目中: Product product = new Product();  product.Name = "Apple"; product.Expiry = new DateTime(2008, 12,

C# 序列化和反序列

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.

序列化和反序列话

定义: 首先来介绍一下什么是序列化和反序列化,下面是序列化和反序列话的定义 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 序列化的作用: 在介绍序列化的作用之前,请大家思考一个问题,对象是如何存储的,以及对象是如何传输的? 是的,这个问题的答案就是序列化的作用,那么对象是如何存储的呢? 1. 把对象串行化为二进制数据 2. 把对象串行化为格式化数据(比如Json序列化.XML序列化) 可以把串行化后的二进制数据或文件存储到磁盘等设

XML序列化和反序列注意点

XML序列化和反序列注意点 在开发过程中经常要用到xml序列化和反序列操作,在实际开发过程中有一些容易出现错误且不好解决的地方,下面就把我在工作中碰到的一些疑难点简单列出: 首先贴一段后面需要操作的代码 [XmlRoot("User")] public class User { public string Name { get; set; } public int Age { get; set; } [XmlArray("Orders")] [XmlArrayIte

python序列化与反序列

python序列化与反序列 在python中提供了两个模块可进行序列化.分别是pickle和json.他们两者的功能都差不多,dumps和dump都是进行序列化,而loads和load则是反序列化. 模块1:pickle pickle是python中独有的序列化模块.有个特别的名字,为泡菜.用于实现Python数据类型与Python特定二进制格式之间的转换. 1. .dumps()和.loads()为格式处理函数 import pickle #序列化 d = dict(name='Bob', a

【leetcode-449】序列化和反序列化二叉搜索树

序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建. 设计一个算法来序列化和反序列化二叉搜索树. 对序列化/反序列化算法的工作方式没有限制. 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树. 编码的字符串应尽可能紧凑. 注意:不要使用类成员/全局/静态变量来存储状态. 你的序列化和反序列化算法应该是无状态的. 思路: 普通的二叉树需要两种遍历结果才能固定二叉树,而