先上代码,感觉这个功能很给力啊。

  class Program
{
static void Main(string[] args)
{
//下面代码将对象Person进行序列化并存储到一个文件中
Person me = new Person(); me.Age = ;
me.WeightInPounds = ; Stream s = File.Open("Me.dat", FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(s, me); s.Close();
//下面代码将进行并行化对象
Stream s2 = File.Open("Me.dat", FileMode.Open); BinaryFormatter bf2 = new BinaryFormatter(); object o = bf2.Deserialize(s2); Person p = o as Person;//as运算符,若是失败则为null
if (p != null)
Console.WriteLine("Deserialized Person aged: " +
"{0} weight:{1}", p.Age, p.WeightInPounds);
s2.Close(); Console.ReadKey();
}
}
[Serializable]
public class Person
{
public Person()
{ }
public int Age;
public int WeightInPounds;
}

  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属性对它进行标记:

     [Serializable]
public class Person
{
public Person()
{ }
public int Age;
public int WeightInPounds;
}

将对象(也就是类的实例)序列化为一个文件的过程:(可能需要Get文件操作相关知识哦)

 //下面代码将对象Person进行序列化并存储到一个文件中
Person me = new Person(); me.Age = ;
me.WeightInPounds = ; Stream s = File.Open("Me.dat", FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(s, me); s.Close();

  首先需要创建流和二进制格式化类的实例,然后调用格式化类的Serialize方法,上面使用的是二进制进行序列化。二进制序列化将类中的所有成员变量都进行序列化,而XML序列化只是针对公共字段(public)。

(2)还原对象

 //下面代码将进行并行化对象
Stream s2 = File.Open("Me.dat", FileMode.Open); BinaryFormatter bf2 = new BinaryFormatter(); object o = bf2.Deserialize(s2); Person p = o as Person;//as运算符,若是失败则为null
if (p != null)
Console.WriteLine("Deserialized Person aged: " +
"{0} weight:{1}", p.Age, p.WeightInPounds);
s2.Close();

  还原过程是序列化过程的逆操作,首先创建格式化程序和流进行读取,然后让格式化程序对对象进行反序列化。

  但是对对象进行反序列化时并不调用类的构造函数。同时,Serializable属性是无法继承的。

(3)选择性序列化

  Sometimes,类可能包含不必被序列化的字段。可以使用NonSerialized属性标记。

     [Serializable]
public class Person
{
public Person()
{ }
public int Age;
[NonSerialized]
public int WeightInPounds;
}

(4)自定义序列化

  可以通过在对象上实现ISerializable接口来自定义序列化过程。这一功能在反序列化后成员变量的值失效时尤其有用(为啥会失效呢?!),但是需要为变量提供值以重建对象的完整状态。要实现接口ISerializable,需要实现GetObjectData方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数(TMD前面不是说不调用构造函数吗o( ̄ヘ ̄o#))。

     [Serializable]
public class Person:ISerializable
{
public Person()
{ }
protected Person(SerializationInfo info,StreamingContext context)
{
Age = info.GetInt32("a");
WeightInPounds = info.GetInt32("w");
}
public virtual void GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue("a", Age);
info.AddValue("w", WeightInPounds);
}
public int Age;
public int WeightInPounds;
}

C# Serializable学习的更多相关文章

  1. JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)

    1.流的简述及演示案例输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表. ...

  2. Java学习之——Java Serializable

    1.什么是Serializable接口? http://en.wikipedia.org/wiki/Serialization Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个 ...

  3. Android学习笔记_46_Android的intent之间Object、List、List<Object>和全局变量数据的传递(Parcelable Serializable)

    转http://blog.csdn.net/pku_android/article/details/7456305 一.传递List<String>和List<Integer> ...

  4. Dubbo学习小记

    前言 周一入职的新公司,到了公司第一件事自然是要熟悉新公司使用的各种技术,搭建本地的环境. 熟悉新公司技术的过程中,首先就是Maven,这个前面已经写过文章了,然后就是Dubbo----公司的服务都是 ...

  5. 学习日记-从爬虫到接口到APP

    最近都在复习J2E,多学习一些东西肯定是好的,而且现在移动开发工作都不好找了,有工作就推荐一下小弟呗,广州佛山地区,谢谢了. 这篇博客要做的效果很简单,就是把我博客的第一页每个条目显示在APP上,条目 ...

  6. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  7. 一步步学习 Spring Data 系列之JPA(一)

    引入: Spring Data是SpringSource基金会下的一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服 ...

  8. JAVA编程思想(第四版)学习笔记----11.10 Map

    之前学习的是Collection层次的List接口.List层次比较简单,除去与多线程安全相关的CoppyOnWriteArrayList<T>类,这一个类在集中涉及多线程相关知识时候再学 ...

  9. MyBatis学习笔记(一)入门

    首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001    没事看看 - MyBatis工具:www.mybatis.t ...

随机推荐

  1. HTML5比较实用的代码

    增强IE兼容性 <!--[if IE]> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js&q ...

  2. 基类方法的反隐藏 反private 秘籍

    class GoodStudent:private Mentor,private Student { public : using Mentor::GetInfo;   ///------------ ...

  3. 1234: ZJTZYRC筛offer(并查集 )

    链接:http://xcacm.hfut.edu.cn/problem.php?id=1234 以后关于字符的输入都用cin吧,换成scanf居然wa了 #include <iostream&g ...

  4. java中setDate(Date date)方法和String与Date之间的转换

    经常在开发的过程中遇到这样的问题,从数据库中读出来的数据需要转换为对像或者java bean,此时经常使用到setDate(Date date);这样的方法.感觉这是个很简单而又难受的事情,在这里浪费 ...

  5. 基于JDK6的JAX-WX为客户端提供XML与JSON格式数据服务,以及客户端采用AXIS调用案例

    1:WebService服务端工程目录如下: 需要第三方jar包:gson-2.2.4.jar\javax.xml.bind.jar\commons-lang-2.5.jar 源码如下: packag ...

  6. WCF 基于Cookie的登录验证回传问题的解决

    参考资料: http://www.cnblogs.com/czcz1024/p/3333138.html http://megakemp.com/2009/02/06/managing-shared- ...

  7. 【转】ubuntu12.04完美安装QQ2012、QQMusic、Foxmail等--wine

    原文网址:http://blog.csdn.net/hanmengaidudu/article/details/17616921 其实在这之前,试过无数次的wine模拟,没有一次成功的,也不能说是不成 ...

  8. Delphi TcxTreelist 设置scrollbars 不起作用的原因

    最近设置TcxTreelist的滚动条,发现水平的不起作用, 即使设置 sboth也不起作用. 查找,发现设置的一些属性导致了这个原因, 建立备忘,如下图: 1.属性, 这个页面,设置的表格,怎么也看 ...

  9. cf442C Artem and Array

    C. Artem and Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  10. Linux远程访问windows时,出现"连接被对端重置"错误

    1.sudo apt-get install rdesktop 需要下载 152 kB 的软件包.       解压缩后会消耗掉 512 kB 的额外空间. 2.运行时出现错误 root@oskey- ...