`
luckilygenius
  • 浏览: 3137 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

小说.Net 中的序列化与反序列化

阅读更多
     一、概述  
   当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。 把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。   
    二、对象的序列化主要有两种用途:   
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁 盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基 本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。  
   2) 在网络上传送对象的字节序列。对象仅在创建对象的应用程序域中有效。除非对象是MarshalByRefObject派生得到或标记为 Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。如果对象是从MarshalByRefObject派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从MarshalByRefObject派生得到的对象标记为Serializable。远程使用此对象时,负责进行序列化并已预先配置为SurrogateSelector的格式化程序将控制序列化过程,并用一个代理替换所有从MarshalByRefObject派生得到的对象。如果没有预先配置为SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则.    

    三、.NET提供了三种序列化方式 
   [1]、XML Serializer    [2]、SOAP Serializer    [3]、BinarySerializer   

    四、基本序列化   
    要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示:[Serializable]   
  public class MyObject   
  {        
     public int n1 = 0;     
    public int n2 = 0;
     public String str = null;    
   }   

  [BinarySerializer]    
   将此类的一个实例序列化为一个文件:  
   MyObject obj = new MyObject(); 
   obj.n1 = 1; obj.n2 = 24;
   obj.str = "一些字符串";
   IFormatter formatter = new BinaryFormatter();
   Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
   formatter.Serialize(stream, obj); stream.Close(); 
   
   反序列化:
   IFormatter formatter = new BinaryFormatter(); 
   Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
   MyObject obj = (MyObject) formatter.Deserialize(fromStream); stream.Close(); 

   [XMLSerializer]    
 将此类的实例序列化成一个Xml文件.
  XmlSerializer ser = new XmlSerializer(obj.GetType());
  ser.Serialize(new FileStream(@"users.xml", FileMode.Create), obj);
  反序列化:
  XmlSerializer serializer = new XmlSerializer(Type.GetType("MyObject"));
  MyObject my=(MyObject)serializer.Deserialize(new FileStream(@"users.xml",FileMode.Open));

  说明:使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为 private 的变量)都将被序列化,但这一点在本例中未明确体现出来。在这一点上,二进制序列化不同于只序列化公共字段的 XML 序列化程序。将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。       
 
  [SOAP Serializer]    
  如果要求具有可移植性,请使用 SoapFormatter。所要做的更改只是将以上代码中的BinaryFormatter换 SoapFormatter,而 Serialize 和 Deserialize 调用不变。
分享到:
评论

相关推荐

    .net c# 序列化 反序列化

    Serialize Deserialize .net c# 序列化 反序列化

    C#或.net json序列化反序列化,适用于与第三方系统做接口用

    C#或.net json序列化反序列化,适用于与第三方系统做接口用,实体自动转json字符串,json自动转视图

    ASPNET中JSON的序列化和反序列化的方法

    在***中处理JSON的序列化和反序列化是Web开发中常见的需求。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由于其简洁性和易于阅读性,被广泛用于服务器与客户端之间的数据传输。下面将详细介绍**...

    ASP.NET序列化与反序列化

    ASP.NET序列化与反序列化应用demo

    VB.NET XML和JSON序列化与反序列化

    在VB.NET编程环境中,XML和JSON序列化与反序列化是常见的数据处理技术,用于将对象转换为文本格式(XML或JSON),以便于存储、传输和解析。这两者都是轻量级的数据交换格式,广泛应用于Web服务和客户端应用程序之间...

    .NET 实体序列化、反序列化XML与Binary

    .NET 实体序列化、反序列化XML与Binary,可实现实体序列化为XML,XML反序列化为实体,实体序列化为Binary,Binary序列化为实体

    ASP.NET中序列化与反序列化-以显示上一次登录的信息示例代码.zip

    在ASP.NET开发中,序列化和反序列化是两个关键的概念,它们对于数据持久化、网络传输以及状态管理等场景有着重要作用。在这个示例中,我们关注的是如何使用这些技术来存储和恢复用户上一次登录的信息。下面将详细...

    .net 序列化和反序列化 Json

    .NET框架中的序列化和反序列化是数据转换的重要部分,特别是在与JSON格式交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和生成,被广泛应用于...

    .NET对象序列化与数据持久化

    .NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化(Q群号:152088818 本群只为有经验的.NET开发者...

    .NET xml序列化及反序列化

    .NET框架中的XML序列化与反序列化是一种将对象实例转换为XML格式的字符串,以便存储或传输的技术。这种技术在跨平台通信、持久化数据、Web服务等方面具有广泛应用。C#语言提供了内置的支持来实现这一过程。 首先,...

    浅谈.Net中的序列化和反序列化

    然后,我们将`MemoryStream`的位置重置,并从流中反序列化对象。之后,可以通过对象的方法和属性使用反序列化后的对象。 除了默认的序列化机制外,.NET还允许开发者控制序列化和反序列化的过程。可以通过实现特定的...

    .net c# 序列化和反序列

    ### .NET C# 中的序列化与反序列化详解 #### 一、概念介绍 **序列化**(Serialization)是指将对象的状态信息转换为可以存储或传输的形式的过程。在.NET框架中,通常会将对象转化为一种可以存储在文件中、数据库中...

    .Net中的序列化和反序列化详解

    这些技术可以用来执行一些额外的操作,如初始化序列化流或自定义序列化过程中的行为。 通过这些属性和接口,开发者可以对对象的序列化和反序列化过程进行更为精细的控制。例如,通过OnSerializing属性可以定义序列...

    asp.net序列化cookie-vs2010版本

    通过下载并运行这个工程,你可以亲自体验和学习如何在ASP.NET和VS2010环境中实现Cookie的序列化和反序列化。这个实践项目对于理解如何在实际项目中处理和存储用户数据非常有帮助。 总结一下,ASP.NET的Cookie序列化...

    asp.net 序列化与反序列化演示

    1. 二进制序列化与反序列化: 二进制序列化是将对象的状态转换为二进制流的过程,它不仅保存对象的公共字段和属性,还保留私有字段和类型信息。这使得在不同调用之间恢复对象状态成为可能,甚至可以在不同的应用...

    .NET XML序列化为实体类与反序列化

    .NET框架中的XML序列化和反序列化...总结来说,`.NET XML序列化为实体类与反序列化`是.NET开发中的关键技能,能够有效地处理数据的XML形式和对象形式之间的转换。通过合理运用,可以在项目中实现高效的数据存储和传输。

    最全的.net序列化操作

    在.NET框架中,序列化和反序列化是两个至关重要的概念,它们被广泛应用于数据存储、网络通信以及状态保存等领域。本篇文章将深入探讨.NET中的序列化操作,特别是使用C#语言实现的各种方法,包括对象到XML、字符串的...

    asp.net购物车类的反序列化

    在ASP.NET开发中,购物车类的序列化与反序列化是常见的操作,尤其是在处理用户会话(Session)数据或存储临时数据时。序列化是将对象的状态转换为可存储或传输的形式,而反序列化则是将这种形式的数据恢复为原来的...

    C#使用Json.Net进行序列化和反序列化及定制化

    在.Net阵营中,Json.Net是由官方推荐的高性能开源序列化/反序列化工具,其官方网站:https://www.newtonsoft.com/json; 一、将对象序列化为Json格式字符串 首先是正常的序列化操作,对于给定的类: private class ...

Global site tag (gtag.js) - Google Analytics