zoukankan      html  css  js  c++  java
  • 第九节:反序列化时重写程序集和类型

    序列化对象时,格式化器输入类型及其定义程序集的全名。反序列化一个对象时,格式化器根据这个信息类准确的判断要为对象构造并初始化什么类型。前面,我们讨论了如何利用IserializationSurrogate接口接管一个特定的类型的序列化和反序列化。实现了IserializationSurrogate接口的类型与一个特定程序集中的特定类型关联在一起。

    但在某些时候,IserializationSurrogate机制的灵活性显的差一些。在下面列举的情形中,有必要将一个类型反序列化成和序列化不同的一个类型。

    1. 开发人员可能想把一个类型的实现从一个程序集移动到另一个程序集。例如,程序集版本号的变化造成新程序集有别于原始程序集。
    2. 服务器上的一个对象序列化到发送给客户端的一个流中。客户端处理流时,可以将对象反序列化成一个完全不同的类型。该类型的代码知道如何向远程服务器发送远程调用。
    3. 开发人员创建了类型的一个新版本。我们想把已经序列化的对象反序列化成类型的新版本。

    利用System.Runtime.Serialization.SerializationBinder类,我们可以非常简单的将一个对象反序列化成一个不同的类型。为此,首先要定义自己的类型,让他从抽象类派生SerializationBinder。在下面的代码中,假定你的版本1.0.0.0的程序集定义了一个名为Ver1的类,并假定程序集的新版本定义了Ver1ToVer2SerializationBinder    类,还定义了一个Ver2的类

    sealed class Ver1ToVer2SerializationBinder : SerializationBinder
        {
            public override Type BindToType(string assemblyName, string typeName)
            {
                AssemblyName assemVer1 = Assembly.GetExecutingAssembly().GetName();
                assemVer1.Version = new Version(1, 0, 0, 0);
                if (assemblyName == assemVer1.ToString() && typeName == "Ver1")
                {
                    return typeof(Ver2);
                }
                return Type.GetType(string.Format("{0},{1}", typeName, assemblyName));
            }
        }

    现在,在构造好一个格式化器之后,构造Ver1ToVer2SerializationBinder类的一个实例,并设置格式化器的可读写属性Binder,让他引用绑定器对象。设置好Binder对象之后,调用格式化器的Deserialize方法。在反序列化期间,格式化器会发现已经设置了一个绑定器,每个对象要反序列化时,格式化器都要调用绑定器的BindToType方法,并向它传递程序集的名称以及格式化器想要反序列化的类型,然后,BindToType判断实际应该构建什么类型,并返回这个类型。

  • 相关阅读:
    云服务器
    Linux 安装python3.7.0
    python 读写excel(xls格式)
    常规问题解决:File "/usr/bin/yum", line 30 及 File "/usr/libexec/urlgrabber-ext-down", line 28
    pyqt5--TableWidGet
    标准库中的装饰器 lru_cache和全新的 singledispatch
    python 导入导出依赖包命令
    python的with语法的深入理解
    时间序列(四) 预测
    时间序列 ARIMA 模型 (三)
  • 原文地址:https://www.cnblogs.com/bingbinggui/p/4622581.html
Copyright © 2011-2022 走看看