การทำให้เป็นอนุกรมและดีซีเรียลไลซ์ใน C # พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

การซีเรียลไลเซชันใน C# จะแปลงอ็อบเจ็กต์ให้เป็นสตรีมของไบต์เพื่อให้สามารถบันทึกไปยังไฟล์หรือส่งต่อระหว่างแอปพลิเคชันได้ ส่วนการดีซีเรียลไลเซชันจะสร้างอ็อบเจ็กต์ขึ้นมาใหม่ ในที่นี้คุณจะได้เรียนรู้วิธีการซีเรียลไลเซชันและดีซีเรียลไลเซชันอ็อบเจ็กต์พร้อมตัวอย่าง

  • 🔄 มันคืออะไร: การทำให้เป็นอนุกรม (Serialization) จะเขียนอ็อบเจ็กต์ C# ลงในไฟล์ และการอ่านกลับเป็นอนุกรม (Deserialization) จะอ่านอ็อบเจ็กต์นั้นกลับมา
  • 🏷️ [แปลงเป็นอนุกรมได้]: คลาสจำเป็นต้องมีแอตทริบิวต์ [Serializable] ก่อนจึงจะสามารถทำการซีเรียลไลซ์ได้
  • 💾 รูปแบบไบนารี: BinaryFormatter ที่ใช้กับ FileStream จะเขียนอ็อบเจ็กต์ในรูปแบบไบนารี
  • 🧩 รูปแบบ: นอกจากนี้ C# ยังรองรับการแปลงข้อมูลเป็น XML และ JSON เพื่อให้ได้ผลลัพธ์ที่อ่านง่าย
  • 🤖 ความช่วยเหลือจาก AI: เครื่องมือ AI เช่น GitHub Copilot สร้างโค้ดสำหรับการแปลงข้อมูลเป็นรูปแบบที่สามารถจัดเก็บได้ทันที

การแปลงข้อมูลเป็นอนุกรมและการแปลงข้อมูลกลับเป็นอนุกรมในภาษา C#

การทำให้เป็นอนุกรมและดีซีเรียลไลซ์ใน C#

แนวคิดของการแปลงข้อมูลเป็นรูปแบบที่สามารถจัดเก็บได้ (Serialization) และการแปลงข้อมูลกลับเป็นรูปแบบที่สามารถจัดเก็บได้ (Deserialization) ถูกนำมาใช้เมื่อใดก็ตามที่ต้องส่งข้อมูลที่เกี่ยวข้องกับวัตถุจากแอปพลิเคชันหนึ่งไปยังอีกแอปพลิเคชันหนึ่ง การแปลงข้อมูลเป็นรูปแบบที่สามารถจัดเก็บได้ใช้เพื่อส่งออกข้อมูลจากแอปพลิเคชันหนึ่งไปยังไฟล์ จากนั้นแอปพลิเคชันปลายทางจะใช้การแปลงข้อมูลกลับเป็นรูปแบบที่สามารถจัดเก็บได้เพื่อส่งออกข้อมูลอีกครั้งtracนำข้อมูลจากแอปพลิเคชันไปใช้ประโยชน์เพิ่มเติม

การทำให้เป็นอนุกรมเป็นแนวคิดที่อ็อบเจ็กต์คลาส C# ถูกเขียนหรือทำให้เป็นอนุกรมไปยังไฟล์ สมมติว่าคุณมีคลาส C# ชื่อ Tutorial และคลาสมีคุณสมบัติ 2 อย่างคือ ID และชื่อ Tutorials

การทำให้เป็นอนุกรมสามารถใช้เพื่อเขียนคุณสมบัติข้อมูลของคลาส Tutorial ลงในไฟล์ได้โดยตรง ใช้เพื่ออ่านข้อมูลจากไฟล์และสร้างออบเจ็กต์บทช่วยสอนอีกครั้ง

ประเภทของการทำให้เป็นอนุกรมใน C#

C# รองรับรูปแบบการจัดเก็บข้อมูลหลายรูปแบบ และคุณควรเลือกรูปแบบที่เหมาะสมตามการใช้งานข้อมูลนั้นๆ รูปแบบหลักๆ มีดังต่อไปนี้

  • การแปลงเป็นอนุกรมไบนารี แปลงอ็อบเจ็กต์ให้เป็นสตรีมไบนารีขนาดกะทัดรัด ทำงานได้เร็ว แต่ไม่สามารถอ่านได้ง่ายสำหรับมนุษย์ และผูกติดอยู่กับ .NET
  • การแปลง XML เป็นอนุกรม ใช้คลาส XmlSerializer เพื่อเขียนคุณสมบัติสาธารณะของอ็อบเจ็กต์ลงในไฟล์ XML ที่อ่านได้
  • การแปลงเป็น JSON ใช้ System.Text.Json หรือ Newtonsoft.Json เพื่อสร้าง JSON ที่มีน้ำหนักเบา ซึ่งเป็นรูปแบบที่พบได้บ่อยที่สุดสำหรับเว็บ API
  • การจัดลำดับ SOAP จัดรูปแบบข้อมูลเป็นข้อความ SOAP สำหรับเว็บเซอร์วิสรุ่นเก่า

วิธีการทำให้วัตถุเป็นอนุกรมใน C#

ลองดูตัวอย่างว่าเราจะบรรลุเป้าหมายนี้ได้อย่างไร

ในตัวอย่างของเรา เราจะดำเนินการตามขั้นตอนระดับสูงด้านล่างในโค้ด

  1. สร้างคลาสชื่อ Tutorial ซึ่งมี 2 คุณสมบัติ คือ ID และ Name
  2. จากนั้นเราจะสร้างวัตถุจากคลาสและกำหนดค่า "1" ให้กับคุณสมบัติ ID และค่า ".Net" ให้กับคุณสมบัติชื่อ
  3. จากนั้นเราจะใช้การทำให้เป็นอนุกรมเพื่อทำให้ออบเจ็กต์ด้านบนเป็นอนุกรมไปยังไฟล์ชื่อ Example.txt
  4. สุดท้าย เราจะใช้การดีซีเรียลไลซ์อ็อบเจ็กต์จากไฟล์และแสดงค่าในคอนโซล

ป้อนโค้ดด้านล่างในไฟล์ program.cs ของแอปพลิเคชันคอนโซล

ขั้นตอน 1) เพิ่มชั้นเรียน

ขั้นตอนแรกคือการเพิ่มคลาสที่จะใช้สำหรับการทำให้เป็นอนุกรม

ทำให้วัตถุเป็นอนุกรมใน C #

Code คำอธิบาย:-

  1. คลาสที่ต้องทำให้เป็นอนุกรมจำเป็นต้องมีแอตทริบิวต์ [Serializable] นี่คือคำหลักใน C# จากนั้นคีย์เวิร์ดนี้จะแนบไปกับคลาสการสอน หากคุณไม่พูดถึงคุณลักษณะนี้ คุณจะได้รับข้อผิดพลาดเมื่อคุณพยายามทำให้คลาสเป็นอนุกรม
  2. ถัดไปคือคำจำกัดความของคลาสที่จะถูกทำให้เป็นอนุกรม ที่นี่เรากำลังกำหนดคลาสที่เรียกว่า "บทช่วยสอน" และจัดเตรียมคุณสมบัติ 2 รายการ อันหนึ่งคือ "ID" และอีกอันคือ "ชื่อ"

ขั้นตอน 2) สร้างวัตถุ

ในขั้นตอนนี้ ขั้นแรกเราจะสร้างอ็อบเจ็กต์ของคลาส Tutorial และทำให้เป็นอนุกรมไปยังไฟล์ชื่อ Example.txt

ทำให้วัตถุเป็นอนุกรมใน C #

Code คำอธิบาย:-

  1. ขั้นแรก เราสร้างออบเจ็กต์ของคลาส Tutorial จากนั้นเราจะกำหนดค่า "1" ให้กับ ID และ ".net" ให้กับคุณสมบัติชื่อ
  2. จากนั้นเราใช้คลาสตัวจัดรูปแบบที่ใช้ในการทำให้เป็นอนุกรมหรือแปลงวัตถุเป็นรูปแบบไบนารี ข้อมูลในไฟล์ในการซีเรียลไลซ์จะทำในรูปแบบไบนารี ต่อไปเราจะสร้างออบเจ็กต์สตรีมไฟล์ ออบเจ็กต์สตรีมไฟล์ใช้เพื่อเปิดไฟล์ Example.txt เพื่อวัตถุประสงค์ในการเขียน คำสำคัญ FileMode.Create และ FileMode.Write ใช้เพื่อระบุโดยเฉพาะว่าควรเปิดไฟล์เพื่อการเขียน
  3. สุดท้ายเราใช้วิธี Serialize เพื่อถ่ายโอนข้อมูลไบนารี่ไปยังไฟล์ จากนั้นเราก็ปิดสตรีมตั้งแต่เขียน การดำเนินการ เสร็จสมบูรณ์

ขั้นตอน 3) ใช้การดีซีเรียลไลซ์

สุดท้ายเพื่อให้แน่ใจว่าข้อมูลมีอยู่ในไฟล์ เราจะใช้การดีซีเรียลไลซ์เพื่อดีซีเรียลไลซ์อ็อบเจ็กต์จากไฟล์

ทำให้วัตถุเป็นอนุกรมใน C #

using System;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
  [Serializable]
  class Tutorial
  {
  public int ID;
  public String Name;
   static void Main(string[] args)
   {
    Tutorial obj = new Tutorial();
    obj.ID = 1;
    obj.Name = ".Net";

    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream(@"E:\ExampleNew.txt",FileMode.Create,FileAccess.Write);

    formatter.Serialize(stream, obj);
    stream.Close();

    stream = new FileStream(@"E:\ExampleNew.txt",FileMode.Open,FileAccess.Read);
    Tutorial objnew = (Tutorial)formatter.Deserialize(stream);

    Console.WriteLine(objnew.ID);
    Console.WriteLine(objnew.Name);

    Console.ReadKey();
  }
 }
}

Code คำอธิบาย:-

  1. เราสร้างวัตถุ”กระแส” เพื่อเปิดไฟล์ Example.txt ในโหมดอ่านอย่างเดียว
  2. จากนั้นเราใช้คลาสฟอร์แมตเตอร์ที่ใช้ในการดีซีเรียลไลซ์อ็อบเจ็กต์ ซึ่งจัดเก็บไว้ในไฟล์ Example.txt วัตถุที่ส่งคืนถูกตั้งค่าเป็นวัตถุ objnew
  3. สุดท้ายนี้ เราจะแสดงคุณสมบัติของวัตถุ “objnew” ไปยังคอนโซลโดยใช้คุณสมบัติ “ID” และ “ชื่อ”

เมื่อตั้งค่าโค้ดข้างต้นแล้ว และโปรเจ็กต์ถูกรันโดยใช้ Visual Studioคุณจะได้ผลลัพธ์ด้านล่าง

ผลลัพธ์:-

ทำให้วัตถุเป็นอนุกรมใน C #

คุณสามารถดูได้จากเอาต์พุตด้านบนว่าค่าจากไฟล์ได้รับการดีซีเรียลไลซ์อย่างถูกต้องและแสดงในคอนโซล

การแปลงข้อมูล JSON เป็นอนุกรมใน C#

JSON เป็นรูปแบบที่ใช้กันอย่างแพร่หลายที่สุดสำหรับแอปพลิเคชันสมัยใหม่และเว็บ API โดยมีฟังก์ชันในตัว System.Text.Json เนมสเปซจะทำการแปลงอ็อบเจ็กต์เป็นรูปแบบอนุกรมและแปลงกลับเป็นรูปแบบเดิมด้วยการเรียกใช้เมธอดเพียงครั้งเดียว ดังแสดงในภาพด้านล่าง

using System;
using System.Text.Json;
namespace DemoApplication
{
  class Tutorial
  {
    public int ID { get; set; }
    public string Name { get; set; }
  }
  class Program
  {
    static void Main(string[] args)
    {
      Tutorial obj = new Tutorial { ID = 1, Name = ".Net" };
      string json = JsonSerializer.Serialize(obj);
      Console.WriteLine(json);

      Tutorial objnew = (Tutorial)JsonSerializer.Deserialize(json, typeof(Tutorial));
      Console.WriteLine(objnew.Name);
      Console.ReadKey();
    }
  }
}

Output:

{"ID":1,"Name":".Net"}
.Net

คำถามที่พบบ่อย

การแปลงข้อมูลเป็นรูปแบบอนุกรม (Serialization) จะแปลงอ็อบเจ็กต์ C# ให้เป็นสตรีมของไบต์ (ไบนารี, XML หรือ JSON) เพื่อให้สามารถบันทึกไปยังไฟล์หรือส่งไปยังแอปพลิเคชันอื่นได้ ส่วนการแปลงข้อมูลกลับเป็นรูปแบบเดิม (Deserialization) จะสร้างอ็อบเจ็กต์ขึ้นมาใหม่จากข้อมูลเหล่านั้น

แอตทริบิวต์ [Serializable] ใช้สำหรับระบุคลาสเพื่อให้สามารถซีเรียลไลซ์อ็อบเจ็กต์ของคลาสนั้นได้ หากไม่มีแอตทริบิวต์นี้ การซีเรียลไลซ์แบบไบนารีจะทำให้เกิดข้อผิดพลาดเมื่อคุณพยายามเขียนอ็อบเจ็กต์ลงในไฟล์

C# รองรับการซีเรียลไลซ์แบบไบนารี (แบบกะทัดรัด เฉพาะใน .NET), การซีเรียลไลซ์แบบ XML ผ่าน XmlSerializer, การซีเรียลไลซ์แบบ JSON ผ่าน System.Text.Json และการซีเรียลไลซ์แบบ SOAP สำหรับเว็บเซอร์วิสรุ่นเก่า

การทำให้เป็นอนุกรม (Serialization) คือการเขียนข้อมูลของวัตถุลงในไฟล์หรือสตรีม ในขณะที่การทำให้เป็นอนุกรมกลับ (Deserialization) คือการอ่านข้อมูลนั้นกลับมาและสร้างวัตถุเดิมขึ้นใหม่ในหน่วยความจำ

BinaryFormatter นั้นล้าสมัยแล้วและถือว่าไม่ปลอดภัย เนื่องจากสามารถเรียกใช้โค้ดที่เป็นอันตรายระหว่างกระบวนการดีซีเรียไลเซชันได้ Microsoft แนะนำให้ใช้ System.Text.Json หรือ XmlSerializer สำหรับแอปพลิเคชันใหม่

ผู้ช่วย AI เช่น GitHub Copilot จะเติมข้อความอัตโนมัติสำหรับการเรียกใช้ Serialize และ Deserialize เพิ่มแอตทริบิวต์ [Serializable] และสร้างโค้ดการแปลงข้อมูลเป็น JSON หรือ XML จากความคิดเห็นสั้นๆ

ใช่แล้ว เครื่องมือที่ขับเคลื่อนด้วย AI จะสร้างคลาสโมเดล เลือกรูปแบบระหว่าง JSON, XML และไบนารี และเพิ่มการจัดการข้อผิดพลาด เพื่อให้โค้ดการแปลงข้อมูลของคุณปลอดภัยและสมบูรณ์

การแปลงข้อมูลเป็นไบนารีใช้ System.Runtime.Serialization.Formatters.Binary, JSON ใช้ System.Text.Json และ XML ใช้ System.Xml.Serialization

สรุปโพสต์นี้ด้วย: