چند وقت پیش برای یکی از برنامه هام امکان تغییر رنگ برنامه رو فراهم کردم توی WPF ما انواع مختلفی رو برای رنگ ها داریم 2 تا از مهم ترینشون Color و Brush هستن Color نوع ساده ای هستش و Brush نوع پیچیده تر با قابلیت های بهتر که حالت های بهتری رو برای رنگ ارائه میکنه مثل LinearGradiantBrush که تصویرهای زیر رو ایجاد میکنه
مشکل از اینجا شروع شد که من میخواستم رنگ رو داخل فایل تنظیمات (که فایل json هست) ذخیره کنم ولی با خطا مواجه میشدم و برنامه کرش میکرد. علت این بود که چون Brush نوع پیچیده ای هستش در نتیجه ساختار پیچیده و تو در تویی هم داره در نتیجه سریالیزر جیسون نمیتونه این ساختار پیچیده رو تجزیه کنه/
اما چطور این مشکل رو باید برطرف کنیم؟ برای حل این مشکل باید خودمون یه جیسون کانورتر شخصی سازی شده ایجاد کنیم تا سریالیزر جیسون به کمک این کانورتر ما عملیات سریالیز رو انجام بده.
برای شروع میتونید یه کلاس به اسم BrushJsonConverter ایجاد کنید.
از کلاس JsonConverter ارث بری کنید. و نوعش رو Brush انتخاب کنید.
public class BrushJsonConverter : JsonConverter<Brush>
حالا 2 تا متد write و read رو override کنید.
توی متد read باید بگیم چطور دسریالیز و توی متد write باید بگیم چطور سریالیز کنیم.
راه های مختلفی برای این کار وجود داره روشی که من استفاده کردم ایجاد کدهای xaml هستش
به کمک کلاس xamlReader و متد Parse میتونیم مقدار xaml رو بخونیم:
public override Brush Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return (Brush)XamlReader.Parse(reader.GetString()); }
همینطور به کمک کلاس XamlWriter میتونیم مقدار xaml رو بنویسیم:
public override void Write(Utf8JsonWriter writer, Brush value, JsonSerializerOptions options) { writer.WriteStringValue(XamlWriter.Save(value)); }
حالا که کانورتر شخصی خودمون رو نوشتیم باید به سریالیز جیسون بگیم که از این کانورتر استفاده کنه کافیه بالای پراپرتی موردنظر کانورتر رو فراخوانی کنیم:
[JsonConverter(typeof(BrushJsonConverter))] public Brush Accent { get; set; }