第六节:流上下文

前面讲过,一组序列化好的对象可以有许多目的地:同一个进程、同一台机器不同进程、不同机器上的不同进程等。在一些比较少见的情况下,一个对象可能想知道它要在什么地方反序列化,从而已不同的方式生成它的状态。例如,对一个包装了Windows信号量对象的一个对象,如果它知道要反序列化到同一个进程中,就可能决定序列化它的内核句柄,这是因为内核句柄在一个进程中有效。然而,如果它知道要反序列化到同一台机器的不同进程中,就可能决定对信号量的字符串名称进行序列化。最后,如果对象知道他要反序列化到一台不同的机器上的一个进程中,就可能抛出一个异常,因为信号量只在一台机器内有效。

本章提到的大量方法都接受一个StreamingContext。StreamingContext结构是一个非常简单的值类型,它只提供了两个公共只读属性。

成员名称          成员类型          说明

State                  StreamingContextStates  一组位标志,指定要序列化/反序列化的对象的来源或目的地

Context       Object        对一个对象的引用,对象包含了用户希望的任何上下文

接受一个StreamingContext结构的方法能检查State属性的位标志,判断要序列化/反序列化的对象的来源或目的地。

  //     指定源或目标上下文是同一计算机上的另外一个进程。

        CrossProcess = 1,

        //

        // 摘要:

        //     指定源或目标上下文是另外一台计算机。

        CrossMachine = 2,

        //

        // 摘要:

        //     指定源或目标上下文是文件。用户可以假定文件的持续时间长于创建它们的进程,并且文件以特定方式将对象序列化,此方式不会使反序列化进程要求访问当前进程中的任何数据。

        File = 4,

        //

        // 摘要:

        //     指定源或目的上下文是持续的存储区,它可以包括数据库、文件或其他后备存储区。用户可以假定持续数据的持续时间长于创建数据的进程,并且持续数据以特定方式将对象序列化,此方式不会使反序列化进程要求访问当前进程中的任何数据。

        Persistence = 8,

        //

        // 摘要:

        //     指定数据在未知位置的上下文中进行远程处理。用户无法假定它是否在同一台计算机上。

        Remoting = 16,

        //

        // 摘要:

        //     指定序列化上下文未知。

        Other = 32,

        //

        // 摘要:

        //     指定对象图形正在进行克隆。用户可以假定克隆图形将继续在同一进程中存在,可以安全地访问句柄或其他对非托管资源的引用。

        Clone = 64,

        //

        // 摘要:

        //     指定源或目标上下文是另外一个 AppDomain。(有关 AppDomain 的说明,请参见 Application Domains)。

        CrossAppDomain = 128,

        //

        // 摘要:

        //     指定可以向其他任何上下文传输(或从其他任何上下文接收)序列化数据。

        All = 255,

在知道了如何获取这些信息后,接着让我们讨论如何设置他们。IFormatter接口(同时又BinaryFormatter和SoapFormatter类型实现)定义了一个StreamingContext类型的属性,名为Context。构造一个格式化器时,格式化器会初始化它的Context属性,将StreamingContextStates设为All,将对额外状态对象的引用设为null。

格式化器构造好之后,就可以使用任何StreamingContextStates为标志来构造一个StreamingContext结构,并可选择传递一个对象引用(对象中包含你需要的任何额外的上下文信息)。现在在调用格式化器的Serialize或Deserialize方法之前,你唯一要做的就是讲格式化器的Context属性设为这个新的StreamingContext对象。

原文地址:https://www.cnblogs.com/bingbinggui/p/4621812.html