序列化是指将对象转换成字节流,从而存储对象或将对象传输到内存、数据库或文件的过程。 它的主要用途是保存对象的状态,以便能够在需要时重新创建对象。 反向过程称为“反序列化”。
序列化的工作原理

下图展示了序列化的整个过程。

对象被序列化成流,其中不仅包含数据,还包含对象类型的相关信息,如版本、区域性和程序集名称。 可以将此流中的内容存储在数据库、文件或内存中。

序列化的用途
借助序列化,开发者可以保存对象的状态,并能在需要时重新创建对象,同时还能存储对象和交换数据。 通过序列化,开发者可以执行如下操作:通过 Web 服务将对象发送到远程应用程序、在域之间传递对象、以 XML 字符串的形式传递对象通过防火墙、跨应用程序维护安全性或用户专属信息。

让对象可序列化
若要序列化对象,需要具有要序列化的对象、包含已序列化对象的一个流,以及一个 Formatter。 System.Runtime.Serialization 包含序列化和反序列化对象所必需的类。

将 SerializableAttribute 特性应用于某个类型,以指示此类型的实例可以被序列化。 如果尝试对没有 SerializableAttribute 特性的类型进行序列化,则会引发异常。

如果想让类中的某个字段不可序列化,请应用 NonSerializedAttribute 特性。 如果可序列化的类型中的一个字段包含指针、句柄或特定环境专用的其他一些数据结构,且不能在其他环境中有意义地重构,不妨让其不可序列化。

如果已序列化的类引用被标记为 SerializableAttribute 的其他类的对象,那么这些对象也会被序列化。

二进制和 XML 序列化

可以使用二进制或 XML 序列化。 在二进制序列化中,所有成员(包括只读成员)都会被序列化,且性能也会有所提升。 XML 序列化可提高代码可读性,以及对象共享和使用的灵活性,从而实现互操作性。
二进制序列化

二进制序列化使用二进制编码来生成精简的序列化以供使用,如基于存储或套接字的网络流。
XML 序列化

XML 序列化将对象的公共字段和属性或方法的参数和返回值序列化成符合特定 XML 架构定义语言 (XSD) 文档要求的 XML 流。 XML 序列化生成已转换成 XML 的强类型类,其中包含公共属性和字段。 System.Xml.Serialization 包含序列化和反序列化 XML 所必需的类。

将特性应用于类和类成员,从而控制 XmlSerializer 如何序列化或反序列化类的实例。

基本和自定义序列化
序列化有两种执行方式:基本和自定义序列化。 基本序列化使用 .NET Framework 自动序列化对象。

基本序列化
基本序列化的唯一要求是对象必须已应用 SerializableAttribute 特性。 NonSerializedAttribute 可用于防止特定字段被序列化。
使用基本序列化时,对象的版本控制可能会产生问题。 对于重要的版本控制问题,可以使用自定义序列化。 基本序列化是最简单的序列化执行方式,但无法提供太多的进程控制。

自定义序列化
在自定义序列化中,可以精确指定要序列化的对象以及具体执行方式。 类必须被标记为 SerializableAttribute,并实现 ISerializable 接口。
如果还想按自定义方式反序列化对象,必须使用自定义构造函数。

设计器序列化
设计器序列化是一种特殊形式的序列化,涉及与开发工具相关联的对象暂留。 设计器序列化是指将对象图转换成源文件以供日后用于恢复对象图的过程。 源文件可以包含代码、标记或 SQL 表信息。

序列化 (C#)的更多相关文章

  1. 【.net 深呼吸】序列化中的“引用保留”

    假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...

  2. 【.net 深呼吸】设置序列化中的最大数据量

    欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...

  3. 用dubbo时遇到的一个序列化的坑

    首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...

  4. Unity 序列化

    Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...

  5. Unity 序列化 总结

    查找了 Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http:// ...

  6. [C#] C# 知识回顾 - 序列化

    C# 知识回顾 -  序列化 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902005.html 目录 序列化的含义 通过序列化保存对象数据 众 ...

  7. Newtonsoft.Json设置类的属性不序列化

    参考页面: http://www.yuanjiaocheng.net/webapi/parameter-binding.html http://www.yuanjiaocheng.net/webapi ...

  8. C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...

  9. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  10. .Net深入实战系列—JSON序列化那点事儿

    序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...

随机推荐

  1. java入门了解08

    1.集合深入 (一)hashSet实现原理: 当我们添加一个元素,HashSet会计算出其Hash值,再根据hash值在哈希表中找出存储他的位置 有两种情况:a.如果算出的hash值在哈希表中位置没有 ...

  2. EntityFramework 学习 一 Disconnected Entities

    如何把断开的实体添加到新的context上下文中 1.首先,我们需要把实体附加到新的context上下文实例中. 2.其次,手动的给实体设置适当的实体状态,因为新的context上下文不知道断开的实体 ...

  3. c版基于链表的插入排序(改进版)

    1. [代码][C/C++]代码 /** * @todo    c版基于链表的插入排序 * @author  Koma **/#include<stdio.h>#include<st ...

  4. Codeforces 429B Working out:dp【枚举交点】

    题目链接:http://codeforces.com/problemset/problem/429/B 题意: 给你一个n*m的网格,每个格子上有一个数字a[i][j]. 一个人从左上角走到右下角,一 ...

  5. node Express安装和使用

    1:在cmd命令行下执行npm install -g express,安装全局的express 2:进入需要创建项目的目录下执行express nodeExpressProject,创建express ...

  6. algorithm 简单用法

    algorithm 简单用法 #include <iostream> #include <vector> #include <algorithm> using na ...

  7. Idea_学习_05_Intellij Idea自动添加注释的方法

    二.参考资料 1. Intellij Idea自动添加注释的方法

  8. Javascript-- jQuery 核心

    jQuery中each方法的应用 jQuery中有个很重要的核心方法each,大部分jQuery方法在内部都会调用each,其主要的原因的就是jQuery的实例是一个元素合集 如下:找到所有的div, ...

  9. HDU 6231 (K-th Number)

    题目链接:https://cn.vjudge.net/problem/HDU-6231 思路:二分+双指针: #include <stdio.h> #include <iostrea ...

  10. QTableWidget设计原则

    一.组成结构: 列表控件由水平表头(self.horizontalHeader()).垂直表头(self.verticalHeader())和单元格(QTableWidgetItem)组成 其中表头又 ...