C# 三种序列化方法分享

 更新时间:2014年02月26日 15:30:57   作者:  
这篇文章主要介绍了C# 三种序列化方法,需要的朋友可以参考下

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

序列化一个对象
为了序列化一个对象,我们需要一个被序列化的对象,一个容纳被序列化了的对象的(字节)流和一个格式化器。进行序列化之前我们先看看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# RGB图像和灰度图像互转的实现

    C# RGB图像和灰度图像互转的实现

    在我们的图像类型教程中定义了RGB颜色模型和灰度格式,本文主要介绍了C# RGB图像和灰度图像互转的实现,文中通过代码介绍的非常清楚,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • C#日期时间类的使用方法(DateTime类、TimeSpan类与DateTimeOffset类)

    C#日期时间类的使用方法(DateTime类、TimeSpan类与DateTimeOffset类)

    在C#中我们常使用到关于时间的相关操作,这篇文章主要给大家介绍了关于C#日期时间类的使用方法,文中介绍的方法分别包括DateTime类、TimeSpan类与DateTimeOffset类的相关资料,需要的朋友可以参考下
    2023-11-11
  • 深入理解C#中new、override、virtual关键字的区别

    深入理解C#中new、override、virtual关键字的区别

    下面小编就为大家带来一篇深入理解C#中new、override、virtual关键字的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • c#并行编程示例分享

    c#并行编程示例分享

    这篇文章主要介绍了c#并行编程示例,大家直接看下面的代码吧
    2014-01-01
  • C#使用OleDb操作Excel和数据库的策略

    C#使用OleDb操作Excel和数据库的策略

    在C#编程中,使用OleDb可以方便地实现对Excel文件和数据库的操作,本文探讨了在C#中使用OleDb技术操作Excel和数据库的策略,文章详述了OleDb的定义、配置环境的步骤,并通过实际代码示例演示了如何高效读写Excel文件和交互数据库,需要的朋友可以参考下
    2024-05-05
  • C#中的命名空间详解(Namespace)

    C#中的命名空间详解(Namespace)

    文章介绍了命名空间在C#编程中的作用,包括命名空间的定义与使用、using关键字的使用以及嵌套命名空间的实现,通过这些机制,开发者可以有效地组织和隔离代码,避免命名冲突,提高代码的可读性和可维护性
    2024-12-12
  • 利用C#实现记事本的功能的示例代码

    利用C#实现记事本的功能的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现简单的记事本的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C# winform实现自动更新

    C# winform实现自动更新

    这篇文章主要为大家详细介绍了C# winform实现自动更新的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • Unity3D游戏开发数据持久化PlayerPrefs的用法详解

    Unity3D游戏开发数据持久化PlayerPrefs的用法详解

    在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。
    2019-08-08
  • C#使用百度Ueditor富文本框实现上传文件

    C#使用百度Ueditor富文本框实现上传文件

    这篇文章主要为大家详细介绍了C#如何使用百度Ueditor富文本框实现上传文件(图片,视频等),文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-07-07

最新评论