استفاده از فایل Json برای ذخیره و بازیابی تنظیمات برنامه

قطعا شرایطی پیش خواهد آمد که شما مجبور شوید داده هایی را به عنوان تنظیمات برنامه در محلی ذخیره کنید و مجددا آن‌ها را فراخوانی کنید. روش‌های مختلفی برای این کار وجود دارند که معروف‌ترین و ساده‌ترین راه استفاده از Settings خود پروژه می‌باشد. اما این به منزله بهترین راه نیست! در این مطلب قصد داریم تنظیمات برنامه را در فایل json با همان ساختار استانداردش ذخیره و بازیابی کنیم.

برای اینکار نیاز به سریالیز و دسریالیز کردن مدل داریم، اگر از دات نت کور استفاده میکنید کتابخانه توکار جیسون در فضای نام System.Text.Json از عهده این کار بر میاد و اگر از نسخه‌های دات نت فریمورک استفاده میکنید باید پکیج newtonsoft.json را نصب کنید.

برای شروع یک کلاس به نام GlobalData (یا هر نام دلخواه دیگری) ایجاد کنید.

چون قرار هست این کلاس هر نوع مدلی را برای ما سریالیز و دسریالیز کند پس کلاس را بصورت جنریک تعریف کنید.

public abstract class GlobalData<T> where T : GlobalData<T>, new()

حالا برای دسترسی به این کلاس یک متغیر جنریک به نام Config ایجاد میکنیم

public static T Config { get; set; }

همینطور برای خواندن فایل جیسون از محل مشخص یک متغیر دیگر به نام filename ایجاد میکنیم

private static string _filename { get; set; }

در این کلاس به 2 متد نیاز داریم، متد اول برای دسریالیز کردن فایل جیسون و متد دوم برای سریالیز کردن اطلاعات:

public static void Init(string FileName = &quotAppConfig.json&quot)       
{            
     _filename = FileName;             
    if (File.Exists(FileName))            
    {                 
       string json = File.ReadAllText(FileName);                  
       Config = (string.IsNullOrEmpty(json) ? new T() : JsonSerializer.Deserialize<T>(json)) ?? new T();            
     }             
    else             
     {                
         Config = new T();             
      }         
}

بصورت پیشفرض محل خواندن فایل جیسون را در کنار فایل اجرایی exe و با نام AppConfig.json در نظر میگیریم، در صورتی که فایل ما موجود بود به کمک ReadAllText محتوای فایل جیسون رو میخوانیم و در صورتی که خالی نبود اقدام به دسریالیز کردن آن میکنیم.

در متد Save نیز:

public static void Save()         
{            
    JsonSerializerOptions options = new JsonSerializerOptions { WriteIndented = true, 
    IgnoreNullValues = true };
   string json = JsonSerializer.Serialize(Config, options); 
    File.WriteAllText(_filename, json);   
}

پراپرتی Config که شامل اطلاعات ما میباشد را در محل موردنظر سریالیز میکنیم.

حالا به سراغ پروژه دمو میرویم، یک کلاس ایجاد میکنیم و از کلاس GlobalData ارث بری میکنیم:

internal class AppConfig : GlobalData<AppConfig>

حالا پراپرتی‌های دلخواه خود را ایجاد میکنیم:


public string ServerUrl { get; set; } = &quothttps://sub.deltaleech.com"  
public bool IsShowNotification { get; set; } = true;  
public NavigationViewPaneDisplayMode PaneDisplayMode { get; set; } = NavigationViewPaneDisplayMode.Left;   
public SkinType Skin { get; set; } = SkinType.Default;

دقت کنید که قبل از خواندن تنظیمات باید ابتدا فایل تنظیمات را دسریالیز کرده باشید پس هنگام اجرای پروژه متد Init را فراخوانی کنید:

protected override void up(StartupEventArgs e) {
GlobalData<AppConfig>.Init();
}

برای خواندن تنظیمات به این صورت عمل کنید:

var skin = GlobalData<AppConfig>.Config.Skin;

و برای ذخیره کردن :

GlobalData<AppConfig>.Config.Skin = Skin.Dark;
GlobalData<AppConfig>.Save();
دقت داشته باشید که اگر بعد از ذخیره کردن تنظیمات قصد داشته باشید اطلاعات جدید را دریافت کنید باید حتما قبل از دریافت اطلاعات متد Init را یکبار دیگر فراخوانی کنید تا اطلاعات جدید نمایش داده شود.