.NET提供了哪几种可进行序列化操作的类型

分析问题

  为了序列化具体实例到某种专业的格式,.NET提供了三种对象序列格式化类型:BinaryFormatter、SoapFormatter和XmlSerializer。

  BinaryFormatter用于将可序列化的对象序列化成二进制的字节流,而SoapFormatter则致力于把可序列化的类型序列化成符合SOAP规范的XML文档,以供使用。对于那些使用Serializable特性来申明成可序列化类型的对象,BinaryFormatter和SoapFormatter可以方便地把它们序列化成特定的格式。

说明

  SOAP是一种位于应用层的网络协议,它基于XML,并且是Web服务的基本协议,后续章节将覆盖关于SOAP的面试题。

  另外,.NET提供了一个执行序列化操作的类型XmlSerializer。不同于BinaryFormatter和SoapFormatter,XmlSerializer并不针对那些使用Serializable特性的类型,事实上,Serializable和NonSerialized特性在XmlSerializer类型对象的操作中完全不起作用,取而代之的是XmlIgnore属性。XmlSerializer可以对没有Serializable特性修饰的类型对象进行序列化,但它仍然有一定的限制:

  1、使用XmlSerializer序列化的对象类型必须显式地拥有一个无参的公共构造方法。

  2、XmlSerializer只能序列化公共成员变量。

  以下代码展示了SoapFormatter和XmlSerializer类型的使用方法,首先为了演示起见,定义一个将被用来测试序列化的简单类型。

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

namespace Test111
{
    class DoSerialize
    {
        static void Main()
        {
            MyObject obj = new MyObject(10, "我是字符串");
            Console.WriteLine("原始对象是:");
            Console.WriteLine(obj);
            //使用SoapFormatter进行序列化
            byte[] data = SoapFormatterSerialize(obj);
            Console.WriteLine("SoapFormatter序列化后:{0}\r\n",Encoding.UTF8.GetString(data));
            //使用XmlSerializer进行序列化
            byte[] data1 = XmlSerializerSerialize(obj);
            Console.WriteLine("XmlSerializer序列化后:{0}\r\n", Encoding.UTF8.GetString(data1));
            Console.Read();
        }

        //SoapFormatter序列化
        static byte[] SoapFormatterSerialize(MyObject obj)
        {
            using (MemoryStream ms=new MemoryStream ())
            {
                SoapFormatter sf = new SoapFormatter();
                sf.Serialize(ms, obj);
                return ms.ToArray();
            }
        }

        //SoapFormatter反序列化
        static MyObject SoapFormatterDeSerialize(byte[] bytes)
        {
            using (MemoryStream ms=new MemoryStream (bytes))
            {
                SoapFormatter sf = new SoapFormatter();
                return sf.Deserialize(ms) as MyObject;
            }
        }

        //使用XmlSerializer序列化
        static byte[] XmlSerializerSerialize(MyObject obj)
        {
            using (MemoryStream ms = new MemoryStream ())
            {
                XmlSerializer xs = new XmlSerializer(typeof(MyObject));
                xs.Serialize(ms, obj);
                return ms.ToArray();
            }
        }

        //使用XmlSerializer反序列化
        static MyObject XmlSerializerDeSerialize(byte[] bytes)
        {
            using (MemoryStream ms=new MemoryStream (bytes))
            {
                XmlSerializer xs = new XmlSerializer(typeof(MyObject));
                return xs.Deserialize(ms) as MyObject;
            }
        }

    }

    [Serializable]
    public class MyObject
    {
        //私有成员,不能被XmlSerializer序列化
        private int _myInt;

        //申明不可被序列化
        [NonSerialized]
        public string _myString1;

        //申明不可被XmlSerializer序列化
        [XmlIgnore]
        public string _myString2;

        public MyObject()
        {
            _myInt = 0;
            _myString1 = string.Empty;
            _myString2 = string.Empty;
        }

        public MyObject(int i, string s)
        {
            _myInt = i;
            _myString1 = s;
            _myString2 = s;
        }

        public override string ToString()
        {
            return new StringBuilder().AppendFormat("整数是:{0}\r\n字符串1是:{1}\r\n字符串2是:{2}",_myInt.ToString(),_myString1,_myString2).ToString();
        }

    }
}

  

答案

  .NET内建类型提供了三个可执行序列化和反序列化操作的类型:BinaryFormatter、SoapFormatter和XmlSerializer。BinaryFormatter和SoapFormatter可以对那些有Serializable特性的类型进行序列化和反序列化操作,除了由NonSerialized特性修饰的成员,两者将序列化所有其他的成员。而XmlSerializer不需要对对象类型申明Serializable特性,但它要求对象类型有一个显式的无参公共构造方法,并且它不能序列化对象的非公共成员和由XmlIgnore修饰的成员。

.NET提供了哪几种可进行序列化操作的类型

时间: 2024-10-07 13:09:50

.NET提供了哪几种可进行序列化操作的类型的相关文章

几种Android数据序列化方案

一.引言 数据的序列化在Android开发中占据着重要的地位,无论是在进程间通信.本地数据存储又或者是网络数据传输都离不开序列化的支持.而针对不同场景选择合适的序列化方案对于应用的性能有着极大的影响. 从广义上讲,数据序列化就是将数据结构或者是对象转换成我们可以存储或者传输的数据格式的一个过程,在序列化的过程中,数据结构或者对象将其状态信息写入到临时或者持久性的存储区中,而在对应的反序列化过程中,则可以说是生成的数据被还原成数据结构或对象的过程. 这样来说,数据序列化相当于是将我们原先的对象序列

Java序列化的几种方式以及序列化的作用

Java序列化的几种方式以及序列化的作用 本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用    有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象.例如,有的时候我们想要 把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流.对于这种通用 的操作,我们为什么不使用统一的格式呢?没错,这里就出现了java

谈谈Delphi中的类和对象:五、类是一种对数据和操作高度的封装机制;六、类是一种代码重用机制

五.类是一种对数据和操作高度的封装机制 1)数据封装 unit Unit2; interface type TEmployee = class; private FName: String; public Constructor Create; function GetName: String; procedure SetName(AName: String); end; implementation constructor TEmployee.Create; begin FName:= 'Xu

Golang细节底层挖掘 - 每种零值为 nil 的类型的底层结构

每种零值为 nil 的类型的底层结构(pdf/9-10) 附件列表

SAP云平台以微服务的方式提供了Document的CRUD(增删改查)操作。该微服务基于标准的CMI

SAP云平台以微服务的方式提供了Document的CRUD(增删改查)操作.该微服务基于标准的CMIS协议(Content Management Interoperability Service). 同标准的CMIS相比,SAP云平台的Document Service增添了一些功能的支持: 通过一个Hello World应用来了解如何在Java程序里消费SAP云平台的Document Service. 通过这个链接下载例子程序. 点击该超链接下载Java Web Tomcat 8 SDK. 例子

shell脚本只提供整数算术运算(三种方式)—((表达式))、let "表达式"、value=`expr 表达式右边` (转载)

转自:http://blog.163.com/[email protected]/blog/static/132229655201131055455754/ 数值运算: 在bash中只提供了整数运算,一般shell通过let和expr这两个指令来实现. 使用格式为:   let  "x=$x+1"    或者    x=`expr  $x+1` 同时,在shell中,也可以通过((表达式)). 使用格式为:((x=$x+1)) 在上面的三种方式中,运算符还可以是: +.-.*./.% 

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

探究一种定长队列操作(C语言版本)

一 问题来源:南京烽火通信面试 二 问题: 现有一种定长队列,长度为2的n次方,此队列可被多线程访问,但必须确保线程级安全,即在任意时刻,队列的长度保持不变. 三 笔者分析 1. 队列的存储结构--链式和顺序均可. 2. 长度为2的n次方--便于移动队头和队尾指针,假设队列长度为size,那么rear = (rear + 1) & (size - 1),&运算比算术求模运算效率高.为此,笔者使用了顺序队列. 3. 怎么确保线程级安全 笔者认为此系统一定同时存在多个读者和写者,读者是读取队头

漫谈二叉搜索树的基本算法(三种思路实现查询操作)

  前面我们说了二叉树前序中序后序遍历的递归非递归算法的实现,下面我们再来说说二叉搜索树~   二叉排序树分为静态查找(find)和动态查找(insert.delete) 二叉搜索树:一棵二叉树,可以为空:如果不为空,满足下列性质: 1.非空左子树的所有键值小于其根结点的键值. 2.非空右子树的所有键值大于其根结点的键值 3.左右子树都是二叉搜索树!! 2.以上是二叉搜索树(也叫二叉排序树)的一些基本操作,此处我们先说一下二叉树的结点定义·· 代码中判断当前结点位置情况的辅助方法以及简单的 ge