Как я могу десериализовать объект Yaml, содержащий строки, в список <string>? - PullRequest
0 голосов
/ 23 октября 2019

Я создал Yaml с именами файлов, чтобы моя программа могла проверить, существует ли каждый файл списка. Я еще мало что сделал с yaml, и документация мне не очень помогает.

Это мой Yaml (он довольно маленький):

DLLs:
    - Filename1
    - Filename2
    - Filename3

На данный момент этомой код:

using (var reader = new StringReader(File.ReadAllText("./Libraries/DLLList.yml")))
{
    /*
     * List<string> allDllsList = deserialized yaml.getting all values of the "DLLs"-list
     */

    var deserializer = new Deserializer();

    var dlls = deserializer.Deserialize<dynamic>(reader)["DLLs"] as List<Object>;
    /*This gives me the Error "Object System.Collections.Generic.Dictionary`2[System.Object,System.Object] cannot be converted into "System.String""*/
    List<string> allDllsList = dlls.Cast<String>().ToList();
}

Может кто-нибудь объяснить мне, как я могу получить значения из файла Yaml и почему он работает так, как вы это делаете?

Редактировать: сейчасработает, я использовал не тот yaml, у меня было 2 версии

1 Ответ

1 голос
/ 23 октября 2019

Сначала возьмите возвращаемое значение из deserializer.Deserialize<dynamic>(reader) и проверьте его в отладчике. Это Dictionary<String, Object>, и у него есть запись с именем "DLLs", которая содержит List<Object>. Все объекты в этом списке являются строками. Вот и все:

var dlls = deserializer.Deserialize<dynamic>(reader)["DLLs"] as List<Object>;

//  Use .Cast<String>() as shown if you want to throw an exception when there's something 
//  that does not belong there. If you're serious about validation though, that's a bit 
//  rough and ready. 
//  Use .OfType<String>() instead if you want to be permissive about additional stuff 
//  under that key.
List<string> allDllsList = dlls.Cast<String>().ToList();
...