C# 序列化原因 (转)

     1.什么是序列化
  序列化是将对象状态转换为可保持或传输的格式的过程,在序列化过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
  2.为什么使用序列化
  a. 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本。
  我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。
  b.另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。
  例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。
  公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。
  当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。

时间: 2024-08-30 04:18:38

C# 序列化原因 (转)的相关文章

对象序列化原因的简单理解

序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,其最终目的都是将内存中的对象持久化或者是在网络上传输.反序列化就是在适当的时候把这个文件再转化成原来的对象使用. 使用序列化的原因 a. 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本.我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据.尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂.可

javabean为什么需要序列化

无论用hibernate或者mybatis结合spring做开发还是其他,系统里持久类往往要实现序列化, implements Serializable.我还是比较好奇,为什么要这样做呢?一直只知道个大概,学习hibernate和mybatis时,一些书中有几个字的介绍,有的书中举得例子或者和spring整合时举得例子也没实现序列化,有时可能在你项目上,如果不是实现serializable接口,可能系统也会正常不会出现错误. 终于有这个时间自己查查这个原因了,翻翻书,看看网页,针对这个问题资料还

spring持久类po或者javabean为什么常常实现序列化?

无论用hibernate或者mybatis结合spring做开发还是其他,系统里持久类往往要实现序列化, implements Serializable.我还是比较好奇,为什么要这样做呢?一直只知道个大概,学习hibernate和mybatis时,一些书中有几个字的介绍,有的书中举得例子或者和spring整合时举得例子也没实现序列化,有时可能在你项目上,如果不是实现serializable接口,可能系统也会正常不会出现错误. 终于有这个时间自己查查这个原因了,翻翻书,看看网页,针对这个问题资料还

序列化---Serializable与Externalizable源码

Serializable接口总结: 1. java.io.Serializable接口是一个标识接口,它没有任何字段和方法,用来表示此类可序列化: 2. 父类声明该接口,则其与其所有子类均可序列化,都无须提供无参构造器(反序列化时不会调用父类或子类的无参构造器) 3. 父类不可序列化,子类声明该接口,父类必须提供子类可访问的无参构造器(子类有无无参构造器均可),程序才能正常运行,但是反序列化后,父类信息均为无参构造器初始化的内容(反序列化时,会调用子类可访问的父类的无参构造器,对父类部分进行初始

转换流 Properties集合 序列化 工具

今日内容介绍1.转换流2.缓冲流3.Properties集合4.序列化流与反序列化流5.commons-IO===========================================================1 转换流概述 OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节 将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去 2 OutputStreamWriter写文本文件 步骤 OutputStr

Serializable 和 Parcelable 区别

http://blog.csdn.net/heng615975867/article/details/16119425 android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable. 一 序列化原因: 1.永久性保存对象,保存对象的字节序列到本地文件中:2.通过序列化对象在网络中传递对象:3.通过序列化在进程间传递对象. 二 至于选取哪种可参考下面的原则: 1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推

[android] Serializable 和 Parcelable 区别

转自:http://www.blogjava.net/lincode/archive/2011/09/16/358805.html android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable. 一 序列化原因: 1.永久性保存对象,保存对象的字节序列到本地文件中:2.通过序列化对象在网络中传递对象:3.通过序列化在进程间传递对象. 二 至于选取哪种可参考下面的原则: 1.在使用内存的时候,Parcelable 类比Serializable性

android.os.BadParcelableException: ClassNotFoundException when unmarshalling:解决办法

例如在用AlarmManager的时候 1 AlarmManager alarmMgr = (AlarmManager) mContext 2 .getSystemService(Context.ALARM_SERVICE); 3 Intent intent = new Intent(ALARM_ALERT); 4 // intent.setExtrasClassLoader(DBTask.class.getClassLoader()); 5 Bundle mBundle=new Bundle(

【玩转Golang】 自定义json序列化对象时,非法字符错误原因

由于前台web页面传来的日期对象是这样的格式“2010-11-03 15:23:22”,所以我安装网上查来的办法,自定义包装了time.Time对象,实现自己的Marshal和UnMarshal方法 type DateTime struct { time.Time } const ctLayout = "2006-01-02 15:04:05" const ctLayout_nosec = "2006-01-02 15:04" const ctLayout_date