当前位置:  编程技术>.net/c#/asp.net

C# 三种序列化方法分享

    来源: 互联网  发布时间:2014-10-28

    本文导语:  序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。 序列化一个对象为了序列化一个对象,我...

序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。

序列化一个对象
为了序列化一个对象,我们需要一个被序列化的对象,一个容纳被序列化了的对象的(字节)流和一个格式化器。进行序列化之前我们先看看System.Runtime.Serialization名字空间。ISerializable接口允许我们使任何类成为可序列化的类。

如果我们给自己写的类标识[Serializable]特性,我们就能将这些类序列化。除非类的成员标记了[NonSerializable],序列化会将类中的所有成员都序列化。

序列化的类型
•二进制(流)序列化
•SOAP序列化
•XML序列化
二进制(流)序列化:
二进制(流)序列化是一种将数据写到输出流,以使它能够用来自动重构成相应对象的机制。二进制,其名字就暗示它的必要信息是保存在存储介质上,而这些必要信息要求创建一个对象的精确的二进制副本。在二进制(流)序列化中,整个对象的状态都被保存起来,而XML序列化只有部分数据被保存起来。为了使用序列化,我们需要引入System.Runtime.Serialization.Formatters.Binary名字空间. 下面的代码使用BinaryFormatter类序列化.NET中的string类型的对象。

代码如下:

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace SerializationTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Serialization of String Object         
            string strobj = "test string for serialization";
            FileStream stream = new FileStream("C:\StrObj.txt", FileMode.Create, FileAccess.Write ,
            FileShare.None);
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, strobj);
            stream.Close();

            //Deserialization of String Object
            FileStream readstream = new FileStream("C:\StrObj.txt", FileMode.Open , FileAccess.Read ,
            FileShare.Read );
            string readdata = (string)formatter.Deserialize(readstream);
            readstream.Close();
            Console.WriteLine(readdata);
            Console.ReadLine();

        }
    }
}

SOAP序列化:
SOAP协议是一个在异构的应用程序之间进行信息交互的理想的选择。我们需要在应用程序中添加System.Runtime.Serialization.Formatters.Soap名字空间以便在.Net中使用SOAP序列化。SOAP序列化的主要优势在于可移植性。SoapFormatter把对象序列化成SOAP消息或解析SOAP消息并重构被序列化的对象。下面的代码在.Net中使用SoapFormatter类序列化string类的对象。

代码如下:

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap ;

namespace SerializationTest
 {
    class Program
    {
        static void Main(string[] args)
        {
            //Serialization of String Object           
            string strobj = "test string for serialization";
            FileStream stream = new FileStream("C:\StrObj.txt", FileMode.Create, FileAccess.Write ,
            FileShare.None);
            SoapFormatter formatter = new SoapFormatter();
            formatter.Serialize(stream, strobj);
            stream.Close();
            //Deserialization of String Object
            FileStream readstream = new FileStream("C:\StrObj.txt", FileMode.Open , FileAccess.Read ,
            FileShare.Read );
            string readdata = (string)formatter.Deserialize(readstream);
            readstream.Close();
            Console.WriteLine(readdata);
            Console.ReadLine();
        }
    }
}

XML序列化:
根据MSDN的描述,“XML序列化将一个对象或参数的公开字段和属性以及方法的返回值转换(序列化)成遵循XSD文档标准的XML流。因为XML是一个开放的标准,XML能被任何需要的程序处理,而不管在什么平台下,因此XML序列化被用到带有公开的属性和字段的强类型类中,它的这些发生和字段被转换成序列化的格式(在这里是XML)存储或传输。”

我们必须添加System.XML.Serialization引用以使用XML序列化。使用XML序列化的基础是XmlSerializer。下面的代码是在.Net中使用XmlSerializer类序列化string对象。

代码如下:

using System;
using System.IO;
using System.Xml.Serialization;

namespace SerializationTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Serialization of String Object           
            string strobj = "test string for serialization";
            FileStream stream = new FileStream("C:\StrObj.txt", FileMode.Create, FileAccess.Write ,
            FileShare.None);
            XmlSerializer  xmlserializer = new XmlSerializer(typeof(string));
            xmlserializer.Serialize(stream, strobj);
            stream.Close();

 
            //Deserialization of String Object
            FileStream readstream = new FileStream("C:\StrObj.txt", FileMode.Open , FileAccess.Read ,
            FileShare.Read );
            string readdata = (string)xmlserializer.Deserialize(readstream);
            readstream.Close();
            Console.WriteLine(readdata);
            Console.ReadLine();

        }
    }
}

什么是格式化器?
  一个格式化器用来确定一个对象的序列格式。它们目的是在网络上传输一个对象之前将其序列化成合适的格式。它们提供IFormatter接口。在.NET里提供了两个格式化类:BinaryFormatter和SoapFormatter,它们都继承了IFormatter接口。

  使用序列化
  序列化允许开发人员保存一个对象的状态并在需要的时候重构对象,同时很好地支持对象存储和数据交换。通过序列化,开发人员可以利用Web Service发送对象到远端应用程序,从一个域传输对象到另一个域,以XML的格式传输一个对象并能通过防火墙,或者在应用程序间保持安全性或用户特定信息等等。


    
 
 

您可能感兴趣的文章:

  • c#序列化和反序列化Json的方法
  • c#泛型序列化对象为字节数组的示例
  • C#中datatable序列化与反序列化实例分析
  • c#数据的序列化和反序列化(推荐版)
  • C#实现json的序列化和反序列化实例代码
  • C#实现复杂XML的序列化与反序列化
  • C#序列化与反序列化的实例详解
  • c#保存窗口位置大小操作类(序列化和文件读写功能)
  • 深入理解C#序列化与反序列化的详解
  • c#正反序列化XML文件示例(xml序列化)
  • c#序列化实例详解
  • C#实现简单的JSON序列化功能代码实例
  • c#对象反序列化与对象序列化示例详解
  • c#序列化详解示例
  • Python namedtuple对象json序列化/反序列化及对象恢复
  • 序列化反序列化库 RedCell
  • java将类序列化并存储到mysql(使用hibernate)
  • mysql iis7站长之家
  • java序列化实现Serializable接口
  • java 基本类型或可序列化类型,这里说的可序列化类型是什么意思???具体都有哪些类型??谢谢
  • C序列化或反序列化库 tpl
  • .net实现序列化与反序列化实例解析
  • 使用XmlSerializer序列化List对象成XML格式(list对象序列化)
  • java序列化和java反序列化示例
  • Java对象序列化和反序列化工具 Xson
  • 轻量级的序列化/反序列化工具 XBlink
  • Java 序列化库 JID
  • 关于object序列化的问题
  • 数据序列化系统 Apache Avro
  • 请教java在序列化时的中文问题?
  • C++序列化框架 febird
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在java中如何序列化
  • 谁知道Bean中的序列化(implements Serializable)的用处,及如何用?
  • 序列化协议 Spearal
  • Java 快速序列化库 FST
  • 请问:能不能动态的运行时生成对象(动态定义对象), 要涉及到哪些技术, 反射,序列化...??
  • Json序列化和反序列化方法解析
  • 探讨JQUERY JSON的反序列化类 using问题的解决方法
  • JSON反序列化库 Upida
  • 关于对象序列化的一个问题,如何从服务器向端客户端传记录集???
  • jquery序列化表单以及回调函数的使用示例
  • java对象序列化与反序列化的默认格式和json格式使用示例
  • 怎么能让序列化同步??
  • jquery序列化表单去除指定元素示例代码
  • 怎样实现对象的序列化
  • J2SE中的序列化的认识
  • 能不能将对象序列化后存到数据库再取出还原?有没有例子?
  • jQuery中验证表单提交方式及序列化表单内容的实现
  • JSP页面之间如何进行对象序列化传递???请教代码写法.I am online now。
  • java序列化问题(求救,高手在哪里)
  • J2SE中的序列化之继承


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3