簡體   English   中英

c# 在 yaml 中使用列表 - 序列化錯誤

[英]c# usage of list in yaml - error in serialization

我能夠反序列化 yaml 文件,查閱並更改值。 由於要求,我必須在變量 NAME、VERSION、...

文件 test.yaml

PlatForm: windows
Version: 10
    # Software Info
SOFTWARE:
    Software-01:
        - NAME    : MFS2020
        - VERSION : 1.12.2015
        - Customized  : true
    Software-02:
        - NAME    : DCS
        - VERSION : 6
        - Customized  : false

在 Johan Skeet 的幫助下開發的測試程序( 使用 yamldotnet 反序列化 yaml 時出錯 - 找不到屬性

我能夠處理數據,但序列化不會保留減號。 目前的代碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using YamlDotNet.RepresentationModel;
using YamlDotNet.Serialization;

public class UserSoft
{
    public string PlatForm { get; set; }
    public string Version { get; set; }
    public Dictionary<string, Software> SOFTWARE { get; set; }

    public class Software
    {
        public string NAME { get; set; }
        public string VERSION { get; set; }
        public string Customized { get; set; }

    }
}

class Program
{
    static void Main(string[] args)
    {
        string text = File.ReadAllText("test.yaml");
        var deserializer = new DeserializerBuilder().Build();
        UserSoft deserialized = deserializer.Deserialize<UserSoft>(text);
        
        deserialized.PlatForm = "Linux";
       

       Console.WriteLine("***Dumping Object Using Yaml Serializer***");
        var stringBuilder = new StringBuilder();
        var serializer = new Serializer();
        stringBuilder.AppendLine(serializer.Serialize(deserialized));
        


        //file construction
        var stream = new FileStream("Output.yml", FileMode.OpenOrCreate);
        using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
        {
            writer.Write(stringBuilder);
            writer.Close();
        }
    }
}

我認為該符號與 yaml 文件中的列表有關。 所以我測試了 object 的變化:

public class UserSoft
{
    public string PlatForm { get; set; }
    public string Version { get; set; }
    public Dictionary<string, Software> SOFTWARE { get; set; }

    public class Software
    {
        public List<string> NAME { get; set; }
        public List<string> VERSION { get; set; }
        public List<string> Customized { get; set; }
    }
}

沒有成功:(

Exception thrown: 'YamlDotNet.Core.YamlException' in YamlDotNet.dll
An unhandled exception of type 'YamlDotNet.Core.YamlException' occurred in YamlDotNet.dll
(Line: 5, Col: 15, Idx: 75) - (Line: 5, Col: 22, Idx: 82): Exception during deserialization

我做錯了什么?

我沒有找到任何可以提供正確幫助的討論。 保留原始格式(包括注釋)可能會很好,但我在幾個討論中看到 yamldotnet 還不能做到這一點。 這個符號是必須的。

提前感謝您,並對這個基本問題感到抱歉。

你的問題在這里:

    Software-01:
        - NAME    : MFS2020
        - VERSION : 1.12.2015
        - Customized  : true

Software-01包含一個序列,其中每個項目都包含一個具有單個鍵值對的映射。 要反序列化為您的原始結構,請將其更改為

    Software-01:
        NAME    : MFS2020
        VERSION : 1.12.2015
        Customized  : true

如果要按原樣反序列化 YAML,請使用以下結構:

public class UserSoft
{
    public string PlatForm { get; set; }
    public string Version { get; set; }
    public Dictionary<string, List<Dictionary<string, string>>> SOFTWARE { get; set; }
}

如您所見,由於Software-01內部有一個 YAML 序列,因此您不能將其直接 map 到自定義 class 中。 通常這是可能的,但遺憾的是缺少相關文檔 - 您當然可以使用生成的UserSoft object 並手動將其轉換為更好的結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM