zoukankan      html  css  js  c++  java
  • 可序列化和自定义序列化

    序列化技术的主要两个目的是:持久化存储、按值封送。

    .NET Framework支持三种序列化器:Binary、XML、SOAP.他们各有优缺点,分别列如下

    1. Binary序列化是完全保真的,因为除非特殊声明为NonSerialized,那么所有成员(包括私有的和公有的)都会被序列化。该序列化器的结果体积比较小,是二进制格式存储的。所以不便于平台复用。

    2. XML序列化只序列化公有成员。它的结果是标准的XML文档,有利于跨平台。

    3. SOAP序列化其实可以说是XML序列化的一种,但它的结果是特定的XML文档,遵从SOAP规范。XML Web Service技术默认会调用该序列化器在客户端与服务器之间传递请求和数据。

    要让对象支持序列化,必须将其标记为可序列化(Serializable),基本上不需要其他的操作,序列化器就可以知道该如何做。但有一个问题需要注意,Serializable是不可继承的,也就是说即便父类是标记为可序列化的,那么子类也仍然需要标记为可序列化。

    对于那些明确不想序列化的成员,可以通过标记为不可序列化(NonSerialized)来告诉序列化器。

    如果想更加精确地控制序列化的过程,那么可以为类型实现ISerizlizable接口。该接口要求实现一个方法GetObjectData,其实很简单,依次把有关你想序列化的成员放进去即可(当然可以做一些特殊的处理,例如加密等),值得注意的是,除了实现该方法,还需要编写一个特殊的构造函数,该函数具有与GetObjectData方法一样的签名,在这个方法里面依次把成员取出来即可。(该方法里面当然可以做另外一些处理,例如解密等,它是在反序列化的时候自动被调用的)

    public int Id { get; set; }
    public string Description { get; set; }

    public absCustomer() { }

    public absCustomer(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
    {
        Id = info.GetInt32("Id");
        Description = info.GetString("Description");
    }

    #region ISerializable 成员

    public virtual void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
    {
        info.AddValue("Id", Id);
        info.AddValue("Description", Description);

    }

    #endregion

    序列化过程的步骤
    在格式化程序上调用 Serialize 方法时,对象序列化按照以下规则进行:

    1. 检查格式化程序是否有代理选取器。如果有,检查代理选取器是否处理指定类型的对象。如果选取器处理此对象类型,将在代理选取器上调用 ISerializable.GetObjectData。 
    2. 如果没有代理选取器或有却不处理此类型,将检查是否使用 Serializable 属性对对象进行标记。如果未标记,将会引发 SerializationException。 
    3. 如果对象已被正确标记,将检查对象是否实现了 ISerializable。如果已实现,将在对象上调用 GetObjectData。 
    4. 如果对象未实现 Serializable,将使用默认的序列化策略,对所有未标记为 NonSerialized 的字段都进行序列化。
  • 相关阅读:
    【BZOJ4621】Tc605 DP
    【BZOJ4624】农场种植 FFT
    【BZOJ4627】[BeiJing2016]回转寿司 SBT
    【BZOJ4631】踩气球 链表+线段树+堆
    Excel error 64-bit version of SSIS
    (转) bicabo Visual Studio 2012自动添加注释(如版权信息等)
    Integration Services 变量
    (转)SSIS_数据流转换(Union All&合并联接&合并)
    (转)SSIS处理导入数据时, 存在的更新, 不存在的插入
    (转)WPF学习资源整理
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1252315.html
Copyright © 2011-2022 走看看