مقدمه

ما در برنامه‌های خود با اشیاء (objects) کار می‌کنیم. این اشیاء در حافظه‌ی RAM کامپیوتر زندگی می‌کنند و تا زمانی که برنامه در حال اجراست، وضعیت (state) خود را حفظ می‌کنند. اما به محض اینکه برنامه بسته شود، تمام این اطلاعات از بین می‌رود. اگر بخواهیم وضعیت یک شیء را برای استفاده در آینده ذخیره کنیم، یا آن را از طریق شبکه برای یک برنامه‌ی دیگر ارسال کنیم، چگونه باید این کار را انجام دهیم؟ ما نمی‌توانیم خود شیء زنده در حافظه را مستقیماً ذخیره یا ارسال کنیم.

اینجاست که مفهوم سریال‌سازی (Serialization) وارد عمل می‌شود. سریال‌سازی، فرآیند تبدیل وضعیت یک شیء به فرمتی است که بتوان آن را به راحتی ذخیره یا منتقل کرد. این فرمت معمولاً یک دنباله‌ای از بایت‌ها یا یک رشته‌ی متنی (مانند JSON یا XML) است. فرآیند معکوس، یعنی خواندن آن داده و بازسازی مجدد شیء اصلی در حافظه، دی‌سریال‌سازی (Deserialization) نامیده می‌شود. در این درس، با مفهوم سریال‌سازی و نحوه‌ی استفاده از یکی از محبوب‌ترین کتابخانه‌ها برای این کار یعنی Newtonsoft.Json آشنا خواهیم شد.

چرا به سریال‌سازی نیاز داریم؟

سریال‌سازی در بسیاری از سناریوهای رایج برنامه‌نویسی کاربرد دارد:

  • ذخیره‌سازی دائمی وضعیت (Persistence): ذخیره‌ی تنظیمات یک برنامه یا وضعیت یک بازی در یک فایل، تا کاربر بتواند در مراجعه‌ی بعدی، کار خود را از همان نقطه ادامه دهد.
  • ارتباطات مبتنی بر وب (Web Communication): ارسال و دریافت داده بین یک کلاینت (مانند یک مرورگر وب یا اپلیکیشن موبایل) و یک سرور از طریق APIهای وب. فرمت JSON استاندارد اصلی برای این نوع ارتباطات است.
  • کش کردن (Caching): ذخیره‌سازی نتایج عملیات‌های هزینه‌بر (مانند یک کوئری پیچیده به پایگاه داده) در یک حافظه‌ی موقت و سریع (مانند Redis) تا در درخواست‌های بعدی بتوان به سرعت به آن دسترسی داشت.
  • ارتباط بین پروسه‌ای (Inter-Process Communication): انتقال داده بین دو برنامه‌ی متفاوت که بر روی یک یا چند ماشین در حال اجرا هستند.

سریال‌سازی به فرمت JSON

<>JSON (JavaScript Object Notation) یک فرمت متنی سبک و قابل خواندن توسط انسان است که به استاندارد اصلی برای تبادل داده در وب تبدیل شده است. کتابخانه‌ی Newtonsoft.Json (که با نام Json.NET نیز شناخته می‌شود) قدرتمندترین و پرکاربردترین ابزار برای کار با JSON در دنیای .NET است. (لازم به ذکر است که .NET مدرن یک سریالایزر داخلی به نام System.Text.Json نیز دارد، اما Newtonsoft.Json به دلیل قدمت و انعطاف‌پذیری بالاتر، همچنان بسیار محبوب است).

برای استفاده از این کتابخانه، ابتدا باید پکیج NuGet آن را به پروژه‌ی خود اضافه کنیم: dotnet add package Newtonsoft.Json.

سریال‌سازی (تبدیل شیء به JSON)

کلاس استاتیک JsonConvert نقطه‌ی ورود اصلی ما به این کتابخانه است. متد SerializeObject یک شیء را گرفته و آن را به یک رشته‌ی JSON تبدیل می‌کند.

Copy Icon Program.cs
using Newtonsoft.Json;

public record Person(string Name, int Age, string City);

// 1. Create an object instance.
Person person = new("Ali", 30, "Tehran");

// 2. Serialize the object to a JSON string.
string jsonString = JsonConvert.SerializeObject(person, Formatting.Indented);

// 3. Print the result.
Console.WriteLine("--- Serialized JSON ---");
Console.WriteLine(jsonString);

این کد، شیء person را به رشته‌ی JSON زیر تبدیل می‌کند. پارامتر Formatting.Indented باعث می‌شود خروجی برای خوانایی بهتر، فرمت‌بندی شود.

{
  "Name": "Ali",
  "Age": 30,
  "City": "Tehran"
}

دی‌سریال‌سازی (تبدیل JSON به شیء)

فرآیند معکوس نیز به همان سادگی و با استفاده از متد DeserializeObject<T> انجام می‌شود. این متد یک رشته‌ی JSON و نوع داده‌ای که می‌خواهیم نتیجه به آن تبدیل شود را به عنوان ورودی می‌گیرد و یک نمونه از آن نوع را برمی‌گرداند.

Copy Icon Program.cs
// Assume we received this JSON string from a file or a web API.
string receivedJson = @"{'Name':'Sara','Age':25,'City':'Shiraz'}";

// 1. Deserialize the JSON string back into a Person object.
Person deserializedPerson = JsonConvert.DeserializeObject<Person>(receivedJson);

// 2. Now we can work with the reconstructed object.
Console.WriteLine("\n--- Deserialized Object ---");
Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");

کتابخانه‌ی Json.NET به صورت هوشمند، کلیدهای موجود در JSON را با پراپرتی‌های همنام در کلاس Person تطبیق داده و یک شیء جدید را با مقادیر مربوطه مقداردهی می‌کند.

کنترل فرآیند سریال‌سازی با صفت‌ها

کتابخانه‌ی Newtonsoft.Json مجموعه‌ای غنی از صفت‌ها (Attributes) را برای کنترل دقیق فرآیند سریال‌سازی فراهم می‌کند. با استفاده از این صفت‌ها، می‌توانید نام پراپرتی‌ها در JSON خروجی را تغییر دهید، پراپرتی‌هایی را از فرآیند نادیده بگیرید، یا نحوه‌ی مدیریت مقادیر null را مشخص کنید.

public class Product
{
    // Change the property name in the JSON output to "product_name".
    [JsonProperty("product_name")]
    public string Name { get; set; }

    // Do not include this property in the JSON output.
    [JsonIgnore]
    public string InternalNotes { get; set; }
}

این صفت‌ها به شما انعطاف‌پذیری بالایی می‌دهند تا خروجی JSON را دقیقاً به شکلی که API یا سیستم مقصد انتظار دارد، تولید کنید.