.Net Serialization

 Trong phần này sẽ đề cập đến Serialization trong .Net. Chúng ta sẽ tìm hiểu

  • Serialization là gì, tại sao phải Serialize một Object
  • Cách sử dụng Binary và Soap Fomartter để serialize Object


1. Giới thiệu

 
Chúng ta biết rằng trong lập trình hướng đối tượng, Object có thể bao gồm nhiều trạng thái khác nhau. Tại một thời điểm Object có một trạng thái xác định, trạng thái này được lưu trong memory. Khi chương trình kết thúc, trạng thái của Object sẽ bị xóa khỏi memory. 
Serialization là một cách để lưu trạng thái của Object ra một “định dạng” (format) mà có thể lưu được trên đĩa cứng hoặc vận chuyển qua mạng.
Người ta cũng sử dụng Serialization để lưu các bản ghi (structure) ra file nhị phân có cấu trúc (giống như trong C), vì các stream của .Net không hỗ trợ việc này. 
Các class dùng trong Serialization nằm trong namespace: System.Runtime.Serialization

 
1.2. Các loại Formatters trong .Net Serialization

 
Các Object được serialize ra một “định dạng” hay stream (luồng). Việc này sẽ được các Formatter class trong .Net kiểm soát.
Có 2 loại Formatter ta sẽ dùng:

  • BinaryFormatter: class này sẽ serialize Object ra một file nhị phân. Được implement từ IremotingFormatter. Có 2 phương thức chính Serialize() và Deserialize().
  • SoapFormatter: class sẽ serialize Object ra một file .xml theo đúng chuẩn của giao thức SOAP. Được implement từ Iformatter. Có 2 phương thức chính Serialize() và Deserialize().


2. Binary Formatter

 
Để serialize một Object cần có 3 yếu tố sau

  • Object được chỉ định [Serializable]
  • Stream để lưu Object sau khi được serialize
  • Formatter class để serialize Object


2.1. Tạo Class đơn giản sẽ dùng cho các ví dụ

 

[Serializable]
    public class Person
    {
        private string name = null;
        private int age = 0;
        private string address = null;
        private string mobile = null;

        public Person() { }

        public Person(string name, int age, string address, string mobile)
        {
            this.name = name;
            this.age = age;
            this.address = address;
            this.mobile = mobile;
        }

        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("Name=" + name);
            sb.AppendLine("Age=" + age);
            sb.AppendLine("Address=" + address);
            sb.AppendLine("Mobie=" + mobile);

            return sb.ToString();
        }
}

Tạo một class Person, để class có thể được serialize cần phải chỉ định [Serializable]

 
2.2. Serialize một Object

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

class TestSerialization
{
    static void Main(string[] args)
    {
        // Create an Object 
        Person person = new Person("HaPN2", 27, "Ha Noi", "0914348307");

        // Create a stream to store a serialized object
        string fileName = @"C:\BinarySerialization.ex";
        FileStream myStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);

        // Create a binary formatter object
        BinaryFormatter formatter = new BinaryFormatter();

        // Serialize object to stream
        formatter.Serialize(myStream, person);

        // Close stream
        myStream.Close();
    }
}

2.3. Deserialize một Object

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

class TestSerialization
{
    static void Main(string[] args)
    {
        // Stream that store the serialized object
        string fileName = @"C:\BinarySerialization.ex";
        FileStream myStream = new FileStream(fileName, FileMode.Open);

        // Create a binary formatter object
        BinaryFormatter formatter = new BinaryFormatter();

        // Deserialize
        Person person = (Person)formatter.Deserialize(myStream);

        // Close stream
        myStream.Close();

        // Show object
        Console.WriteLine(person.ToString());
    }
}

3. Soap Formatter
3.1. Serialize một Object

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;

class TestSerialization
{
    static void Main(string[] args)
    {
        // Create an Object 
        Person person = new Person("HaPN2", 27, "Ha Noi", "0914348307");

        // Stream to serialize object
        string fileName = @"C:\SoapSerialization.xml";
        FileStream myStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
        // Create a soap formatter object
        SoapFormatter formatter = new SoapFormatter();

        // Serialize object to stream
        formatter.Serialize(myStream , person);

        // Close stream
        myStream .Close();
    }
}

3.2. Deserialize một Object

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;

class TestSerialization
{
    static void Main(string[] args)
    {
        // Stream that store the serialized object
        string fileName = @"C:\SoapSerialization.xml";
        FileStream myStream = new FileStream(fileName, FileMode.Open);

        // Create a binary formatter object
        SoapFormatter formatter = new SoapFormatter();

        // Deserialize
        Person person = (Person)formatter.Deserialize(myStream);

        // Close stream
        myStream.Close();

        // Show object
        Console.WriteLine(person.ToString());
    }
}

 

4. Chú ý

 
1. Chỉ định một thành phần của Class không bị Serialize.
Mặc định tất cả các thành phần trong Class: thuộc tính và phương thức sẽ đều được serialize khi thực hiện. Tuy nhiên ta có thể dùng chỉ định [NonSerialized] để thiết lập không serialize thành phần này
Vd: 
 

[NonSerialized]
public string GetName()
{
    return name;
}

2. Reference đến Soap formatter
Đôi khi ta sẽ phải thiết lập reference đến SoapFormatter trong VS 2005.
Từ menu: Project > Add Reference… > .Net > 
System.Runtime.Serialization.Formatters.Soap

3. Nếu trong Class được chỉ định [Serializable] có gọi đến các Class khác. Thì tất cả các Class tham chiếu này cũng đều phải được chỉ định [Serializable]

Nguồn: http://my.opera.com/hapn2/blog/net-serialization