Friday, May 1, 2009

C# - How to implement OnDeserialization for [Serializable] class with [NonSerialized] members



[Serializable]
class ProductItem : IDeserializationCallback
{
#region Fields
private int prdId;
private string prdName;
private decimal prdPrice;
[NonSerialized] private decimal prdTax;
#endregion

#region Properties
public int PrdId
{
get { return prdId; }
set { prdId = value; }
}
public string PrdName
{
get { return prdName; }
set { prdName = value; }
}
public decimal PrdPrice
{
get { return prdPrice; }
set { prdPrice = value; }
}
public decimal PrdTax
{
get { return prdTax; }
set { prdTax = value; }
}
#endregion

public ProductItem(int _prdId, string _prdName, decimal _prdPrice)
{
PrdId = _prdId;
PrdName = _prdName;
PrdPrice = _prdPrice;
PrdTax = _prdPrice * 0.12m;
}

void IDeserializationCallback.OnDeserialization(object sender)
{
// Calculate tax after deserialization completes
PrdTax = PrdPrice * 0.12m;
}
}



private void btnSerializeCallBack_Click(object sender, EventArgs e)
{
ProductItem prdItemObj = new ProductItem(1, "Cranker", 10);
string fName = @"C:\FB\Tst.data";
using (FileStream fs = new FileStream(fName, FileMode.Create))
{
SoapFormatter sf = new SoapFormatter();
sf.Serialize(fs, prdItemObj);
}
}

private void btnDeSerializeCallBack_Click(object sender, EventArgs e)
{
string fName = @"C:\FB\Tst.data";
using (FileStream fs = new FileStream(fName, FileMode.Open))
{
SoapFormatter sf = new SoapFormatter();
ProductItem prdItemObj = (ProductItem)sf.Deserialize(fs);
}
}

Share/Bookmark

No comments: