Serialization in Database
page 3 of 5
by Bhuban Mohan Mishra
Feedback
Average Rating: This article has not yet been rated.
Views (Total / Last 10 Days): 41397/ 70

Working with Custom Objects

Images are one of the primitive objects that one can think of to store in the database. Apart from these, we can also store customized objects in the database. But for this purpose, the class must be serialized. Let us consider an example of an AppSettings class. Here we will save the setting of an application like the window size, position, etc. to a table named SETTINGS.

Listing 3

[Serializable]
public class AppSettings
{
  public int screenX;
  public int screenY;
  public int screenW;
  public int screenH;
  public DateTime lastLogin;
}

The above class can now be used to store the last used settings in the database and on the next login can be retrieved and applied to the application. The example here is a simple class, but this can be customized according to the requirements.

The serialization of the AppSettings object is same as the Image example given above. Here we will use the following two functions.

SerializeNSaveToDB()

This function first creates an AppSettings object and initializes all the required variables and serializes it into a MemoryStream. It then calls the Call_Upload_Object() function to save the serialized object to the database.

DeserializeNSaveToFile()

This function fetches the serialized AppSettings object from the database with the help of MySqlClient Classes. The object is converted into a MemoryStream object which is then de-serialized with the help of a BinaryFormatter. This is in turn converted into an AppSettings object and the settings can now be easily applied to our application.

Listing 4: Working with Custom Objects

private void SerializeNSaveToDB()
{
  MemoryStream str = new MemoryStream();
  try
  {
    string column = "?OBJECT";
    AppSettings oSettings = new AppSettings();
    oSettings.screenX = this.Left;
    oSettings.screenY = this.Top;
    oSettings.screenW = this.Width;
    oSettings.screenH = this.Height;
    oSettings.lastLogin = DateTime.Now;
    BinaryFormatter oBFormatter = new BinaryFormatter();
    oBFormatter.Serialize(str, oSettings);
    byte[]oSerializedObj = str.ToArray();
    string Query =
      "INSERT INTO SETTINGS (NAME, SETTINGS) VALUES('Settings 1',  ? OBJECT)
      ";Call_Upload_Object(Query, oSerializedObj, column);
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
  finally
  {
    str.Close();
  }
}
 
private void DeserializeNSaveToFile()
{
  DataTable ds = new DataTable();
  MySqlConnection oMySqlConn = new MySqlConnection(MySqlConnString);
  try
  {
    string Query = "SELECT * FROM SETTINGS";
    MySqlCommand cmd = new MySqlCommand(Query, oMySqlConn);
    oMySqlConn.Open();
    MySqlDataAdapter da = new MySqlDataAdapter(cmd);
    da.Fill(ds);
    MemoryStream oStr = new MemoryStream((byte[])ds.Rows[0]["SETTINGS"]);
    BinaryFormatter oBFormatter = new BinaryFormatter();
    AppSettings oSettings = (AppSettings)oBFormatter.Deserialize(oStr);
    this.Left = oSettings.screenX;
    this.Top = oSettings.screenY;
    this.Width = oSettings.screenW;
    this.Height = oSettings.screenH;
    txtLastLogin.Text = oSettings.lastLogin.ToString();
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
  finally
  {
    oMySqlConn.Close();
  }
}

View Entire Article

User Comments

Title: good   
Name: lavanya
Date: 2012-12-27 2:36:26 AM
Comment:
gud article
Title: Good   
Name: Bimla
Date: 2011-12-31 9:34:41 PM
Comment:
I like this article very much..
Title: gud   
Name: kranthi
Date: 2011-06-14 3:05:39 AM
Comment:
GUD...
Title: great   
Name: nadeem
Date: 2010-11-30 10:26:32 AM
Comment:
great thats to cool i have been searching it for around d2 days finally and with gods grace i happen to land here cheers to you weell done !!!
Title: Serialization   
Name: Alekhya
Date: 2009-06-19 8:59:30 AM
Comment:
Excellent
Title: WONDERFUL, BUT...   
Name: GIADDOM VIGALE
Date: 2009-05-20 11:46:18 PM
Comment:
THIS ARTICLE WAS ACTUALLY WHAT I WANTED BUT COULD YOU MAKE AVAILABLE FOR ME AN ARTICLE ON "BINARY SERIALIZATION OF MYSQL BACKEND FOR CLIENT GRID DATA HANDLING"

THANKS.
Title: At Last!!   
Name: Peter Derwa
Date: 2008-10-23 5:13:10 AM
Comment:
At last one proper example of the thing i'm searching for all day.
Thanks allot!
Title: Thank You!   
Name: Vaibhav
Date: 2008-01-23 11:13:33 AM
Comment:
Very well written article and accompanying code.
Title: Thanks   
Name: Emrah Uslu
Date: 2007-12-30 2:09:05 PM
Comment:
The article is very useful and explanatory. Thanks a lot.
Title: gud   
Name: miffa
Date: 2007-09-17 9:44:33 AM
Comment:
It'a a good demo...........
Title: sqls   
Name: Percival
Date: 2007-08-01 3:26:54 PM
Comment:
u hav a greate things and now I'l search here only
Thanks a lot
Title: Serialization   
Name: Bhuban
Date: 2007-06-27 1:17:36 PM
Comment:
Hello Nitin,

Yes, serialization is same where ever you do. The matter is where do you store your serialized data i.e. in a file or in the database.
Title: Serialization   
Name: Nitin Sharma(.Net Developer)
Date: 2007-06-27 3:08:49 AM
Comment:
But how is DataBase Serialization different from the normal serilization?????????????..or is it same??????
Title: Awesome!   
Name: Mike J
Date: 2007-04-12 3:55:02 PM
Comment:
Thanks a ton, Bhuban!
Title: Re: Change in custom class   
Name: Bhuban M Mishra
Date: 2007-04-12 2:18:06 PM
Comment:
Hello Mike,

Just forgot to tell you that if you mark the variable as [NonSerialized], then you will not be able to serialize that variable. If you want to store the new variable in the database, then try the [OptionalField] attribute for the new variable. This should fulfill your requirement.

You can go through the following article as a reference. Look into Versioning.

http://msdn.microsoft.com/msdnmag/issues/04/10/AdvancedSerialization/

Thanks,
Bhuban
Title: Re: Change in custom class   
Name: Bhuban M Mishra
Date: 2007-04-12 1:56:31 PM
Comment:
Hello Mike,

If you want to change the structure and in the same time want to access the old data, then the thing you are referring to is called Versioning. Here, you use your old data as well as new data simultaneously.

The only way to do this is by marking the new property or variable (in your case the screenColorDepthBit variable) with NonSerialized attribute. This is what is referred to as Selective Serialization.

Ex. [NonSerialized] public int screenColorDepthBit;

Though I have not implemented it, I will try to implement it as soon as possible and update you.

Thanks,
Bhuban
Title: Change in custom class   
Name: Mike J
Date: 2007-04-12 1:24:37 PM
Comment:
This is a great write-up. I am planning on using your serialization to store a custom class similarly to your demonstration. I was wondering how a change in that structure might affect existing records in the database. For example, if I were add a property to your AppSettings class called:

public int screenColorDepthBit;

What would happen if I tried to deserialize an object into the new structure? I'll post another if I find out before anyone else does. Thanks!






Community Advice: ASP | SQL | XML | Regular Expressions | Windows


©Copyright 1998-2024 ASPAlliance.com  |  Page Processed at 2024-04-19 5:36:15 AM  AspAlliance Recent Articles RSS Feed
About ASPAlliance | Newsgroups | Advertise | Authors | Email Lists | Feedback | Link To Us | Privacy | Search