《CLR Via C#(第三版)》 第二十四章(1)

第24章运行时序列化

序列化(serialization)是将一个对象或者对象图转换成一个字节流的过程。反序列化(deserialization)是将一个字节流转换回对象图的过程。

应用程序的状态(对象图)可轻松保存到一个磁盘文件或数据库中,并在应用程序的下次运行时恢复。ASP.NET就是利用序列化和反序列化来保存和恢复会话状态的。

一组对象可轻松通过网络发送给另一台机器上运行的过程。Microsoft .Net Framework的Remoting(远程处理)架构会对按值封送(marshaled by value)的对象进行序列化和反序列化。这个技术还可用于跨越AppDomain边界发送对象。

24.1 序列化/反序列化快速入门

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

class Program
{
    static void Main()
    {
        List<int> array = new List<int>() { 123, 123, 534, 5, 7567, 234 };

        //序列化
        MemoryStream ms = new MemoryStream();
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, array);

        //重置流的位置
        ms.Position = 0;

        //读取流的内容
        //StringBuilder sb = new StringBuilder();
        //for (int i = 0; i < ms.Length; i++)
        //{
        //    int by = ms.ReadByte();
        //    sb.Append(((char)by).ToString());
        //}
        //Console.Write(sb.ToString());

        //反序列化
        array = (List<int>)bf.Deserialize(ms);
        foreach (int i in array)
            Console.WriteLine(i);
        Console.ReadKey();
    }
}

FCL提供了两个格式化器:BinaryFormatter和SoapFormatter,从.Net 3.5起,SoapFormatter类已被废弃。

要序列化一个对象图,只需要调用格式化器的Serialize方法,并向它传递两样东西:对一个流对象的引用,以及对想要序列化的对象图的一个引用。

格式化器的Deserialize方法会检查流的内容,构造流中的所有对象的实例,并初始化所有这些对象的字段,使它们具有与当初序列化时相同的值。通常将Deserialize方法返回的对象引用转型为应用程序期待的类型。

注意点:

保证代码为序列化和反序列化使用相同的格式化器。

可将多个对象图序列化到一个流中。

24.2 使类型可序列化

为需要序列化的类型应用一个名为System.SerializableAttribute的定制attribute。

SerializableAttribute这个定制Attribute只能应用于引用类型(class),值类型(struct),枚举类型和委托类型。枚举和委托类型总是可序列化的,所以不必显式应用SerializableAttribute attribute。

SerializableAttribute attribute不会被派生类继承。

[Serializable]
class MyClass { }

[Serializable]
struct MyStruct { }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值