蓝色京广线

蓝色京广线 http://www.koosee.com

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

c# 反序列化时,初始化标识[NonSerialized]字段[zz]

  串行化(序列化)主要是用来在不同程序域(不同程序与分别在网络的不同地址也可以)间互相调用的,串行化以后网络中将只传输数据,而不会传输对象,而传统的com在不同程序域间传输,是将数据用对象包装后一起传输的,这样就将降低系统性能!  
  二进制串行化比xml的性能高很多,xml串行化可以解决程序跨平台的问题

 

我们知道我们可以添加Serializable属性来序列化和反序列化对象。它通常用来储存、传输对象。例如

[Serializable]

class ShoppingCartItem

{

    public int productId;

    public decimal price;

    public int quantity;

    public decimal total;

    public ShoppingCartItem(int _productID, decimal _price, int _quantity)

    {

        productId = _productID;

        price = _price;

        quantity = _quantity;

        total = price * quantity;

    }

}

但是有时候,我们并不需要序列化所有的成员(经常动不动序列化所有的有点浪费存储空间和增加传输压力). 所以我们可以用

[NonSerialized]来标识属性、方法等。例如

 

[Serializable]

class ShoppingCartItem

{

    public int productId;

    public decimal price;

    public int quantity;

    [NonSerialized]

    public decimal total;

    public ShoppingCartItem(int _productID, decimal _price, int _quantity)

    {

        productId = _productID;

        price = _price;

        quantity = _quantity;

        total = price * quantity;

    }

}

 

如果是这样的话, total 将不会被序列化,当然在反序列化过程中也不会被初始化,但是假如我们要在反序列化对象中得到total的结果怎么办呢?那我们就需要

IDeserializationCallback接口并实现IDeserializationCallback.OnDeserialization方法。例如

[Serializable]

class ShoppingCartItem : IDeserializationCallback {

public int productId;

public decimal price;

public int quantity;

[NonSerialized] public decimal total;

public ShoppingCartItem(int _productID, decimal _price, int _quantity)

{

productId = _productID;

price = _price;

quantity = _quantity;

total = price * quantity;

}

void IDeserializationCallback.OnDeserialization(Object sender)

{

// After deserialization, calculate the total

total = price * quantity;

}

}

 

posted on 2010-06-16 00:19  蓝色京广线  阅读(1267)  评论(0)    收藏  举报