序列化(serialization)就是把对象的当前状态(字段及其值)转换数据流,可以把得到的数据流存放到文件、数据库、内存或其它地方;然后在我们需要时,使用反序列化(deserialization)将对象恢复。在.Net中,要序列化一个对象,可以使用属性将类的元素标为可序列化的(Serializable)和不可被序列化的(NonSerialized)。通过SoapFormatter(基于XML)和BinaryFormatter可以得到不同的数据流格式。

一、可序列化(Serializable)和不可序列化(NonSerialized)属性
    如果允许一个类序列化,需要在类上标记[Serializeble]属性

[Serializable] //通过标记该属性,说明此类可以被序列化
public class User
{
    private int id;
    private string name;
    [NonSerialized] //标记该属性后,email字段将不会被序列化
    private string email;

    public User(int id, string name, string email)
    {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}

如果一个可序列化的类包含了对另一个类的引用,那么被引用的类也必须支持序列化

[Serializable] //通过标记该属性,说明此类可以被序列化
public class User
{
    private int id;
    private string name;
    private Contact contact; //引用了一个类

    public User(int id, string name, string email)
    {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}

[Serializable]
public class Contact
{
  private string email;
  private string qq;
  private string msn
}

二、SoapFormatter和BinaryFormatter
    下面的代码分别使用SoapFormatter和BinaryFormatter将User类序列化到文件中:

namespace SerializApp
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Soap;
    using System.Runtime.Serialization.Formatters.Binary;

    class Program
    {
        static void Main(string[] args)
        {
            User user = new User(1001, "netflu", "netflu@msn.com");

            FileStream mySoap = File.Create(@"C:\Soap_user.txt");
            new SoapFormatter().Serialize(mySoap, user);
            mySoap.Close();

            FileStream myBinary = File.Create(@"C:\Binary_user.dat");
            new BinaryFormatter().Serialize(myBinary, user);
            myBinary.Close();
        }
    }

    [Serializable]
    public class User
    {
        private int id;
        private string name;
        [NonSerialized]
        private string email;

        public User(int id, string name, string email)
        {
            this.id = id;
            this.name = name;
            this.email = email;
        }
    }
}

使用SoapFormatter得到的数据流(Soap_user.txt):

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:User id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/SerializApp/SerializApp%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<id>1001</id>
<name id="ref-3">netflu</name>
</a1:User>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

使用BinaryFormatter得到的数据流(Binary_user.dat):

               BSerializApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   SerializApp.User   idname    ?     netflu

通过对SoapFormatter和BinaryFormatter输出的数据流进行观察,可以发现他们各有优缺点,Soap的可读性高,而Binary的数据量小。

三、自定义序列化
    如果要精确控制对象的序列化,需要实现ISerializable接口

//ISerializable接口原型
public interface ISerializable
    {
        void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
    }

以下是一个实现了ISerializable接口的类:

    [Serializable]
    public class User : ISerializable
    {
        private int id;
        private string name;
        private string email;

        public User(int id, string name, string email)
        {
            this.id = id;
            this.name = name;
            this.email = email;
        }

        private User(SerializationInfo info, StreamingContext context)
        {
            this.id = info.GetInt32("id");
            this.name = info.GetString("name");
            this.email = info.GetString("email");
        }

        ISerializable 成员#region ISerializable 成员

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("id", id);
            info.AddValue("name", name);
            info.AddValue("email", email);
        }

        #endregion
    }

主要通过SerializationInfo对象提供的AddValue方法通过键值对来保存一个值,然后通过一系列GetValue方法来取出值。

转载于:https://www.cnblogs.com/netflu/archive/2006/02/28/339962.html

.NET 中的序列化相关推荐

  1. Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout

    Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout 1. 梯度消失和梯度爆炸 在使用pytorch中的序列化 容器之前,我们 ...

  2. java kryo 序列化_java中的序列化方式及dubbo使用kryo序列化

    java中的序列化方式: 1. 自带序列化  ObjectInputSteam. ObjectOutStream等 2. hession2 3. json ,xml等格式 4.kryo 5.FST - ...

  3. fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...

    点击上方蓝字设为星标 每天傍晚伴你一起成长! Java 中的序列化和反序列化是一个重要的编程概念.它适用于所有主要的编程语言.在本章中,我们将尝试在Java语言的上下文中理解此概念.在本章的最后,我们 ...

  4. C#中JSON序列化和反序列化

    有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境-- 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...

  5. python中常用的序列化模块_Python中的序列化和反序列化

    为什么要序列化 内存中的字典.列表.集合以及各种对象,如何保存到一个文件中. 设计一套协议,按照某种规则,把内存中的数据保存到文件中,文件是一个个字节序列.所以必须把数据额转换为字节序列,输出到文件, ...

  6. AFN中请求序列化的设置

    最近遇到一个需求:要求从客户端传到服务器的参数是json字符串,于是我本能的用pod装了afn然后进行了request和response Serialization的相关设置 AFHTTPSessio ...

  7. spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava

    spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava在SPRING MVC3中,比如做REST时,经常要用JASON去解析,遇到了日期格式化的问题, ...

  8. java中的序列化和反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

  9. 谈谈:.Net中的序列化和反序列化

    序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一 ...

  10. java 序列化实例_Java中的序列化与反序列化实例

    创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...

最新文章

  1. idea将普通目录转换为模块maven module。
  2. LeetCode:104_Maximum Depth of Binary Tree | 二叉树的最大深度 | Easy
  3. fastxml 大于符号不转换_你可能不知道的MATLAB入门技巧#第二话
  4. Windows Store App JavaScript 开发:选取文件和文件夹
  5. 局域网从另一台电脑copy文件(Linux系统下)
  6. kangle 3.4.8 发布,国产开源 Web 服务器
  7. 计算机组成原理 透明性,计算机组成原理试题
  8. 占鳌头。当雪花沁透着
  9. 第十三首歌曲《翱翔的骄鹰》
  10. BZOJ 1050 [HAOI2006]旅行comf(并查集)
  11. 在Kotlin中@Suppress可能取到的值
  12. 22222222222
  13. ccc 邮箱_CCC的完整形式是什么?
  14. C语言经典例题及答案3
  15. Java okhttp 实现对有道翻译的爬取
  16. iOS音频编程之实时语音通信
  17. 跟随自己,让自己的灵魂做主
  18. 编写一个程序,检测标准IO的缓冲区的大小
  19. 校园快递管理系统-JAVA.JSP【数据库设计、论文、源码、开题报告】
  20. BGP MPLS 单域实验及排错思路

热门文章

  1. 周志华教授:长文详细教你如何做研究与写论文?
  2. 【论文笔记】基于LSTM的问答对排序
  3. 每日算法系列【LeetCode 1053】交换一次的先前排列
  4. 每日算法系列【LeetCode 1004】最大连续1的个数 III
  5. 运营破局,四步完成从0到1
  6. Netty的并发编程实践1:正确使用锁
  7. 简易JTAG烧写程序的执行逻辑和流程
  8. 1.8 Linux用户与用户组文件权限
  9. 奔图打印机显示未连接_国货之“彩” |奔图CP2200DW彩色激光打印机首测
  10. 力扣-179 最大数