C# Serializable学习
先上代码,感觉这个功能很给力啊。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //下面代码将对象Person进行序列化并存储到一个文件中 6 Person me = new Person(); 7 8 me.Age = 32; 9 me.WeightInPounds = 300; 10 11 Stream s = File.Open("Me.dat", FileMode.Create); 12 13 BinaryFormatter bf = new BinaryFormatter(); 14 15 bf.Serialize(s, me); 16 17 s.Close(); 18 //下面代码将进行并行化对象 19 Stream s2 = File.Open("Me.dat", FileMode.Open); 20 21 BinaryFormatter bf2 = new BinaryFormatter(); 22 23 object o = bf2.Deserialize(s2); 24 25 Person p = o as Person;//as运算符,若是失败则为null 26 if (p != null) 27 Console.WriteLine("Deserialized Person aged: " + 28 "{0} weight:{1}", p.Age, p.WeightInPounds); 29 s2.Close(); 30 31 Console.ReadKey(); 32 } 33 } 34 [Serializable] 35 public class Person 36 { 37 public Person() 38 { 39 40 } 41 public int Age; 42 public int WeightInPounds; 43 }
Serializable串行化是指存储和获取磁盘文件、内存或其他地方中的对象。在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原实例区别开来。
只需给类添加Serializable属性,就可以实现串行化实例的成员。当然也可以指定类的部分成员不进行序列化。[NonSerialized]。
并行化是串行化的逆过程,数据从存储介质中读取出来,并赋给类的实例变量。
Serializable在C#中的作用.NET 中的对象序列化
Serializable在C#中的作用(.Net中的对象序列化)
序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化。以下各部分将探讨 .NET 框架提供的可靠的序列化机制,并着重介绍使您可以根据需要自定义序列化过程的一些重要功能。
持久存储
我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。
公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。
当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。
按值封送
对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。
如果对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换所有从 MarshalByRefObject 派生得到的对象。如果没有预先配置为 SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则(请参阅序列化过程的步骤)。
上面这段简介是网上看到的,前面看的还可以,后边就╮(╯_╰)╭。
(1)基本序列化
要使一个类可序列化,最简单的方法是使用Serializable属性对它进行标记:
1 [Serializable] 2 public class Person 3 { 4 public Person() 5 { 6 7 } 8 public int Age; 9 public int WeightInPounds; 10 }
将对象(也就是类的实例)序列化为一个文件的过程:(可能需要Get文件操作相关知识哦)
1 //下面代码将对象Person进行序列化并存储到一个文件中 2 Person me = new Person(); 3 4 me.Age = 32; 5 me.WeightInPounds = 300; 6 7 Stream s = File.Open("Me.dat", FileMode.Create); 8 9 BinaryFormatter bf = new BinaryFormatter(); 10 11 bf.Serialize(s, me); 12 13 s.Close();
首先需要创建流和二进制格式化类的实例,然后调用格式化类的Serialize方法,上面使用的是二进制进行序列化。二进制序列化将类中的所有成员变量都进行序列化,而XML序列化只是针对公共字段(public)。
(2)还原对象
1 //下面代码将进行并行化对象 2 Stream s2 = File.Open("Me.dat", FileMode.Open); 3 4 BinaryFormatter bf2 = new BinaryFormatter(); 5 6 object o = bf2.Deserialize(s2); 7 8 Person p = o as Person;//as运算符,若是失败则为null 9 if (p != null) 10 Console.WriteLine("Deserialized Person aged: " + 11 "{0} weight:{1}", p.Age, p.WeightInPounds); 12 s2.Close();
还原过程是序列化过程的逆操作,首先创建格式化程序和流进行读取,然后让格式化程序对对象进行反序列化。
但是对对象进行反序列化时并不调用类的构造函数。同时,Serializable属性是无法继承的。
(3)选择性序列化
Sometimes,类可能包含不必被序列化的字段。可以使用NonSerialized属性标记。
如
1 [Serializable] 2 public class Person 3 { 4 public Person() 5 { 6 7 } 8 public int Age; 9 [NonSerialized] 10 public int WeightInPounds; 11 }
(4)自定义序列化
可以通过在对象上实现ISerializable接口来自定义序列化过程。这一功能在反序列化后成员变量的值失效时尤其有用(为啥会失效呢?!),但是需要为变量提供值以重建对象的完整状态。要实现接口ISerializable,需要实现GetObjectData方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数(TMD前面不是说不调用构造函数吗o( ̄ヘ ̄o#))。
1 [Serializable] 2 public class Person:ISerializable 3 { 4 public Person() 5 { 6 7 } 8 protected Person(SerializationInfo info,StreamingContext context) 9 { 10 Age = info.GetInt32("a"); 11 WeightInPounds = info.GetInt32("w"); 12 } 13 public virtual void GetObjectData(SerializationInfo info, 14 StreamingContext context) 15 { 16 info.AddValue("a", Age); 17 info.AddValue("w", WeightInPounds); 18 } 19 public int Age; 20 public int WeightInPounds; 21 }
转载于:https://www.cnblogs.com/icebear-studio/p/5481913.html
C# Serializable学习相关推荐
- jpa 跨表_JPA多表查询的解决办法
实际业务中,多表关联查询应用实例很多,怎么使用JPA进行多表查询,可以选择不同的方法优化. 记下在JPA中多表查询的有效使用方法. 使用关系映射 就是使用一对多,多对一,一对一这种关系进行关联映射, ...
- spark学习-52-Spark的org.apache.spark.SparkException: Task not serializable
1.概述 报错这个一般是org.apache.spark.SparkException: Task not serializable 17/12/06 14:20:10 INFO MemoryStor ...
- 学习Java中实现serializable接口
什么是Serializable接口? 一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的.Serializable实际上是一个空接口,没有什么具体内容,它的目的 ...
- android 序列化 xml serializable,关于Android中的序列化Serializable和Parcelable的学习
简单地说,"序列化"就是将运行时的对象状态转换成二进制,然后保存到流,内存或者通过网络传输给其他端. 两者最大的区别在于 存储媒介的不同,Serializable使用 I/O 读写 ...
- 第2节 mapreduce深入学习:4, 5
第2节 mapreduce深入学习:4.mapreduce的序列化以及自定义排序 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化 ...
- Shiro源码学习之二
接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...
- Shiro源码学习之一
一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...
- atomic原子类实现机制_JUC学习笔记--Atomic原子类
Atomic 原子操作类包 Atomic包 主要是在多线程环境下,无锁的进行原子操作.核心操作是基于UnSafe类实现的CAS方法 CAS CAS: compareAndSwap :传入两个值:期望值 ...
- sparkcore分区_Spark学习:Spark源码和调优简介 Spark Core (二)
本文基于 Spark 2.4.4 版本的源码,试图分析其 Core 模块的部分实现原理,其中如有错误,请指正.为了简化论述,将部分细节放到了源码中作为注释,因此正文中是主要内容. 第一部分内容见: S ...
最新文章
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。...
- HDOJ 1143 Tri Tiling
- springboot使用EntityManager执行自定义SQL
- SAP云平台和SAP HANA Enterprise Cloud(HEC)的区别
- 你还会写这段C51程序吗?
- php如何解码图片,php基于base64解码图片与加密图片还原实例_PHP
- 【学习笔记】Docker - 01. Docker是啥
- java字符流写入式乱码_字节流乱码与字符流乱码
- linux中vim内容定位,Linux运维行走江湖必备之:vim命令常用参数
- Java Socket文件上传
- [cocos2dx笔记015]关于cocos2dx Button三种状态说明
- poj1847 最短路
- ZOJ1002-Fire Net(深度优先搜索)
- Matlab 取整函数
- Go编译原理系列1(编译原理概览)
- 51单片机波特率计算的公式和方法
- Photoshop CS3 中文版安装教程
- html做群聊通讯方法,一例完整的websocket实现群聊demo
- chrome浏览器扩展打包成crx
- 【paddlepaddle安装报错系列】Installing collected packages :OpenCV-python ERROR :After october 2020 you…