A YAML egy emberileg is olvasható adat szerializációs nyelv, amit legfÅ‘képp konfigurációs fájlok (Pl.: Docker) leÃrására alkalmaznak. A nyelvet úgy tervezték, hogy bármilyen programozási nyelven implementálható legyen.
Szintaxisban hasonlÃt a Python nyelvhez, mivel a behúzásoknak és a tagolásoknak jelentÅ‘sége van. Azonban csak a space karakter használható behúzások létrehozására. AdattÃpusok ábrázolhatóságában hasonlÃt a JSON-hoz a tudása. A formátum specifikációja a https://yaml.org/ cÃmen lelhetÅ‘ fel.
Ami miatt a konfigurációs fájlok közkedvelt leÃró nyelve lett az az, hogy a # szimbólum utáni karaktereket kommentnek tekinti az értelmezÅ‘, ami a kézzel szerkeszthetÅ‘séget nagymértékben megkönnyÃti.
.NET esetén a keretrendszerbe nincs beépÃtett támogatása, de a YamlDotNet NuGet csomag (projekt és forráskód: https://github.com/aaubry/YamlDotNet) segÃtségével könnyen épÃthetünk YAML támogatást az alkalmazásunkba.
Az alábbi példaprogram a YamlDotNet használatát mutatja be:
using System;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace YAML
{
//record a ToString() generálása miatt
internal record class Person
{
public string Name { get; init; }
public int Age { get; init; }
public float HeightInInches { get; init; }
public Address Address { get; init; }
}
//record a ToString() generálása miatt
internal record class Address
{
public string Street { get; init; }
public string City { get; init; }
public string State { get; init; }
public string Zip { get; init; }
}
internal class Program
{
private static void Main(string[] args)
{
var person = new Person
{
Name = "Abe Lincoln",
Age = 25,
HeightInInches = 6f + 4f / 12f,
Address =new Address
{
Street = "2720 Sundown Lane",
City = "Kentucketsville",
State = "Calousiyorkida",
Zip = "99978",
},
};
//szerializáció
ISerializer serializer = new SerializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.Build();
string yaml = serializer.Serialize(person);
Console.WriteLine(yaml);
//deszerializáció
IDeserializer deserializer = new DeserializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.Build();
Person deserizalized = deserializer.Deserialize<Person>(yaml);
Console.WriteLine(deserizalized.Name);
}
}
}
A szerializációért az Iserializer interfész felelÅ‘s, aminek az implementációja a SerializerBuilder osztály segÃtségével hozható létre. Ennek az osztálynak a metódusain keresztül konfigurálhatjuk a működést. A példában tevepúpos elnevezéseket használunk. A szerializáló példányt a Build() metódus meghÃvásával hozzuk létre.
A deszerializáció hasonlóan működik. Ezért az IDeserializer interfész felel, amelynek a létrehozását a DeserializerBuilder osztály segÃti. A létrehozott IDeserializer példány Deserialize generikus metódusával tudunk ténylegesen deszerializálni.
Fontos megjegyezni, hogy a szerializáció és deszerializáció csak akkor kompatibilis egymással, ha ugyan azokat a beállÃtásokat alkalmazzuk. A teljes YamlDotNet dokumentációja a https://github.com/aaubry/YamlDotNet/wiki cÃmen érhetÅ‘ el.
A Program kimenete
name: Abe Lincoln
age: 25
heightInInches: 6.3333335
address:
street: 2720 Sundown Lane
city: Kentucketsville
state: Calousiyorkida
zip: 99978
Abe Lincoln