العمل مع YAML في C# (.NET): مكتبة YamlDotNet
\n\nYAML (YAML Ain't Markup Language) هو تنسيق مناسب لتسلسل البيانات، يُستخدم غالبًا لملفات التكوين، وصف خطوط أنابيب CI/CD، Docker Compose وملفات Kubernetes. في نظام .NET البيئي، المكتبة الرئيسية للعمل مع YAML هي YamlDotNet — أداة قوية، عالية الأداء ومتوافقة تمامًا مع مواصفات YAML 1.1 و 1.2.
\n\nفي هذه المقالة سنشرح: كيفية تثبيت YamlDotNet، إجراء التسلسل الأساسي وإلغاء التسلسل لكائنات C#، إعداد العلامات المخصصة ومعالجة هياكل البيانات المعقدة.
\n\nتثبيت YamlDotNet
\n\nالمكتبة متاحة عبر NuGet. قم بتنفيذ الأمر في وحدة تحكم مدير الحزم:
\n\ndotnet add package YamlDotNet\n\nأو عبر Package Manager Console:
\n\nInstall-Package YamlDotNet\n\nالاستخدام الأساسي: إلغاء تسلسل YAML إلى كائن C#
\n\nلنفترض أن لدينا ملف YAML config.yaml يحتوي على إعدادات التطبيق:
app:\n name: MyApp\n version: 2.0.1\n debug: true\ndatabase:\n host: localhost\n port: 5432\n credentials:\n user: admin\n password: secret\n\nلننشئ الفئات المقابلة في C#:
\n\npublic class AppConfig\n{\n public string Name { get; set; }\n public string Version { get; set; }\n public bool Debug { get; set; }\n}\n\npublic class DatabaseConfig\n{\n public string Host { get; set; }\n public int Port { get; set; }\n public CredentialsConfig Credentials { get; set; }\n}\n\npublic class CredentialsConfig\n{\n public string User { get; set; }\n public string Password { get; set; }\n}\n\npublic class RootConfig\n{\n public AppConfig App { get; set; }\n public DatabaseConfig Database { get; set; }\n}\n\nالآن لنقم بإلغاء تسلسل YAML إلى كائن:
\n\nusing YamlDotNet.Serialization;\nusing YamlDotNet.Serialization.NamingConventions;\n\nvar yamlContent = File.ReadAllText("config.yaml");\n\nvar deserializer = new DeserializerBuilder()\n .WithNamingConvention(UnderscoredNamingConvention.Instance) // لـ snake_case\n .Build();\n\nvar config = deserializer.Deserialize<RootConfig>(yamlContent);\n\nConsole.WriteLine(config.App.Name); // MyApp\nConsole.WriteLine(config.Database.Port); // 5432\n\nتسلسل كائنات C# إلى YAML
\n\nالمهمة العكسية — تحويل كائن C# إلى سلسلة YAML:
\n\nvar config = new RootConfig\n{\n App = new AppConfig { Name = "MyApp", Version = "2.0.1", Debug = true },\n Database = new DatabaseConfig\n {\n Host = "localhost",\n Port = 5432,\n Credentials = new CredentialsConfig { User = "admin", Password = "secret" }\n }\n};\n\nvar serializer = new SerializerBuilder()\n .WithNamingConvention(CamelCaseNamingConvention.Instance) // camelCase في YAML\n .Build();\n\nvar yaml = serializer.Serialize(config);\nConsole.WriteLine(yaml);\n\nالنتيجة:
\n\napp:\n name: MyApp\n version: 2.0.1\n debug: true\ndatabase:\n host: localhost\n port: 5432\n credentials:\n user: admin\n password: secret\n\nالعمل مع المجموعات والأنواع المعقدة
\n\nيدعم YamlDotNet بشكل ممتاز القوائم، القواميس والهياكل المتداخلة. مثال مع قائمة:
\n\npublic class Project\n{\n public string Name { get; set; }\n public List<string> Tags { get; set; }\n}\n\n// YAML:\n// name: MyProject\n// tags:\n// - dotnet\n// - yaml\n// - csharp\n\nvar yaml = @"\nname: MyProject\ntags:\n - dotnet\n - yaml\n - csharp\n";\n\nvar deserializer = new DeserializerBuilder().Build();\nvar project = deserializer.Deserialize<Project>(yaml);\n\nforeach (var tag in project.Tags)\n Console.WriteLine(tag);\n\nالعلامات والأنواع المخصصة (TagMapping)
\n\nأحيانًا تحتوي ملفات YAML على ع