ตามนิยาม (ในวิกิพีเดีย) เค้าบอกไว้ว่า
Serilizationคือกระบวนการแปลงวัตถุให้กลายเป็นสายข้อมูลในรูปแบบบิตทำให้สามารถเก็บรักษาวัตถุดังกล่าวไว้บนสื่อเก็บข้อมูล (เช่น HDD)หรือจะเอาไปส่งผ่าน Network ก็ได้
Deserilization คือกระบวนการย้อนกลับของ Serialization คือการแปลงจากสายข้อมูลในรูปแบบบิตให้กลับมาเป็นวัตถุของเรานั่นเอง

จากรูป วัตถุ "ปลาดิบ" จะถูกแปลงเป็นข้อมูลในรูปแบบ Binaryเพื่อเก็บไว้บนดิสค์ครับและหากต้องการนำมาใช้ใหม่ก็แค่โหลดข้อมูลขึ้นมาทำการ Deserialzation
จริงๆแล้วขั้นตอนการเก็บรักษา "สถานะ" ของวัตถุตามที่เห็นในรูปมันก็สามารถทำมือได้เช่นกัน โดยอาจจะเขียนข้อมูลต่างๆใส่ Text Fileแล้วเขียนลอจิกที่ทำหน้าที่โหลดข้อมูลดังกล่าวขึ้นมาเองแต่ตามความเข้าใจของผมวิธีการนี้ก็เป็นวิธีการหนึ่งในการเก็บรักษาสภาพของวัตถุที่สะดวกดีครับเขียนเพิ่มนิดหน่อยก็ทำ Serialization ได้เลย
วิธีการทำใน C# มีขั้นตอนดังต่อไปนี้ ยกตัวอย่างจากคลาสที่เขียนในวันนี้
- เพิ่ม Attribute Serializable เข้าไปที่หัว Class ก่อน
- ให้ Class implements ISerializable ต้องเขียน method GetObjectData เพิ่ม
- ทำ Deserialization Constructor ที่มีรูปแบบตามที่กำหนด
- เพิ่มลอจิกส่วนที่เป็นการทำ Serialize และ Deserialize
ส่วนของ ToBinaryFile และ FromBinaryFile เป็นส่วนของข้อ 4 นะครับ
เวลาจะทำ Serialize ก็เรียก ToBinaryFile("filename.osl") และเวลาจะ Deserialize ก็เรียก Word.FromBinaryFile("filename.osl")
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace WordParser
{
[Serializable()]
class Word : ISerializable
{
public string Value { get; set; }
public string Description { get; set; }
public int Popularity { get; set; }
public Word()
{
}
public Word(SerializationInfo info, StreamingContext context)
{
Value = (string)info.GetValue("Value", typeof(string));
Popularity = (int)info.GetValue("Popularity", typeof(int));
Description = (string)info.GetValue("Description", typeof(string));
}
#region ISerializable Members
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Value", Value);
info.AddValue("Popularity", Popularity);
info.AddValue("Description", Description);
}
#endregion
public static Word FromBinaryFile(string file)
{
using (Stream stream = File.Open(file, FileMode.Open))
{
BinaryFormatter bformatter = new BinaryFormatter();
Word ret = (Word)bformatter.Deserialize(stream);
return ret;
}
}
public void ToBinaryFile(string file)
{
using (Stream stream = File.Open(file, FileMode.Create))
{
BinaryFormatter bformatter = new BinaryFormatter();
bformatter.Serialize(stream, this);
}
}
}
}
Credit: DevStock
ไม่มีความคิดเห็น:
แสดงความคิดเห็น