A Quick review of Serialization and DeSeralization events
.Net provides the facility to intercept Serialization / DeSeralization by providing following events.
Serialization:
- OnSerializing
- OnSerialized
DeSeralization
- OnDesrializing
- IDeserialazationCallback
Courtesy: MCTS 70-536 Self Paced Training Kit by Microsoft
Following is the program with implementation of [OnDesrialized] event which checks if the total of the item(s) of a certain category is less than 20, it applies appropriate discount.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Security.Permissions;
using System.Xml.Serialization;
namespace CustomSerializationSample
{
[Serializable]
public class ShoppingCartItem : ISerializable
{
public int productID;
public decimal price;
public int quantity;
[XmlIgnore]
public decimal total;
public ShoppingCartItem(int _productID, decimal _price, int _quantity)
{
productID = _productID;
price = _price;
quantity = _quantity;
total = price * quantity;
}
public ShoppingCartItem()
{
}
[OnDeserialized]
void CalculateTotal(StreamingContext sc)
{
decimal discount;
if (total < 20)
{
discount = (total / 100) * 12;
total = total - discount;
}
}
public override string ToString()
{
return "ProductID: " + this.productID + " : Price " + this.price.ToString() +
", Quantity: " + quantity + ", Disc: " + total;
}
#region ISerializable Members
public ShoppingCartItem(SerializationInfo info,
StreamingContext context)
{
productID = info.GetInt32("Product ID");
price = info.GetInt32("Price");
quantity = info.GetInt32("Quantity");
total = price * quantity;
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Product ID", productID);
info.AddValue("Price", price);
info.AddValue("Quantity", quantity);
}
#endregion
}
}