使用 yamldotnet 反序列化 yaml 时出错 - 属性 未找到
Error deserializing yaml with yamldotnet - Property not found
我正在使用 C#、YamlDotNet 并遵循以下示例:
但我收到以下错误:
Exception thrown: 'YamlDotNet.Core.YamlException' in YamlDotNet.dll
YamlDotNet.Core.YamlException: (Line: 1, Col: 1, Idx: 0) - (Line: 1, Col: 1, Idx: 0): Exception during deserialization ---> System.Runtime.Serialization.SerializationException: Property 'PlatForm' not found on type 'NAC21_Calculator.UserSoft'.
at YamlDotNet.Serialization.TypeInspectors.TypeInspectorSkeleton.GetProperty(Type type, Object container, String name, Boolean ignoreUnmatched)
at YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func`3 nestedObjectDeserializer, Object& value)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
--- End of inner exception stack trace ---
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.Deserializer.Deserialize(IParser parser, Type type)
at YamlDotNet.Serialization.Deserializer.Deserialize[T](IParser parser)
at YamlDotNet.Serialization.Deserializer.Deserialize[T](TextReader input)
at NAC21_Calculator.YamlImporter.Deserialize(String yamlName) in D:\UserInput.cs:line 124
at NAC21_Calculator.UserInput.GenerateBut_click(Object sender, EventArgs e) in D:\UserInput.cs:line 68
The program '[20556] NAC21_Calculator.exe' has exited with code 0 (0x0).
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
对象定义:
public class UserSoft
{
public List<string> PlatForm { get; set; }
public List<string> Version { get; set; }
public List<software> SOFTWARE { get; set; }
public class software
{
public string NAME { get; set; }
public string VERSION { get; set; }
public string Customized { get; set; }
}
}
并在按下按钮时执行反序列化:
private void GenerateBut_click(object sender, EventArgs e)
{
UserSoft obj = YamlImporter.Deserialize("file_template.yml");
Console.WriteLine("Platform: {0}", obj.PlatForm);
Console.WriteLine("Version: {0}", obj.Version);
foreach (var soft in obj.SOFTWARE)
Console.WriteLine("Software: {0}", soft);
}
catch (Exception Ex)
{
Console.WriteLine(Ex.ToString());
}
}
public class YamlImporter
{
public static UserSoft Deserialize(string yamlName)
{
StreamReader sr = new StreamReader(yamlName);
string text = sr.ReadToEnd();
var input = new StringReader(text);
var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
UserSoft deserializeObject = deserializer.Deserialize<UserSoft>(input); /* compile error */
return deserializeObject;
}
}
我是 C# 的新手,这个问题是唯一真正阻碍我的问题。
提前致谢。
这里有一些问题。
首先,您的 PlatForm
和 Version
属性是 List<string>
类型,但值只是一个字符串。
其次,您的 SOFTWARE
属性 不代表列表,而是地图 - 字符串“Software-01”和“Software-02”实际上是地图中的键。
第三,您已明确声明要使用驼峰命名约定进行反序列化,但您的 YAML 实际上并未使用该约定。
这是一个最小的完整示例,其中更正了这些方面:
using System;
using System.Collections.Generic;
using System.IO;
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);
Console.WriteLine($"Platform: {deserialized.PlatForm}");
Console.WriteLine($"Version: {deserialized.Version}");
foreach (var pair in deserialized.SOFTWARE)
{
var value = pair.Value;
Console.WriteLine($"{pair.Key}: Name={value.NAME}; Version={value.VERSION}; Customized={value.Customized}");
}
}
}
输出:
Platform: windows
Version: 10
Software-01: Name=MFS2020; Version=1.12.2015; Customized=true
Software-02: Name=DCS; Version=6; Customized=false
顺便说一句,我强烈建议您尽量保持大小写一致,并遵循 .NET 命名约定。
我正在使用 C#、YamlDotNet 并遵循以下示例:
但我收到以下错误:
Exception thrown: 'YamlDotNet.Core.YamlException' in YamlDotNet.dll
YamlDotNet.Core.YamlException: (Line: 1, Col: 1, Idx: 0) - (Line: 1, Col: 1, Idx: 0): Exception during deserialization ---> System.Runtime.Serialization.SerializationException: Property 'PlatForm' not found on type 'NAC21_Calculator.UserSoft'.
at YamlDotNet.Serialization.TypeInspectors.TypeInspectorSkeleton.GetProperty(Type type, Object container, String name, Boolean ignoreUnmatched)
at YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func`3 nestedObjectDeserializer, Object& value)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
--- End of inner exception stack trace ---
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.Deserializer.Deserialize(IParser parser, Type type)
at YamlDotNet.Serialization.Deserializer.Deserialize[T](IParser parser)
at YamlDotNet.Serialization.Deserializer.Deserialize[T](TextReader input)
at NAC21_Calculator.YamlImporter.Deserialize(String yamlName) in D:\UserInput.cs:line 124
at NAC21_Calculator.UserInput.GenerateBut_click(Object sender, EventArgs e) in D:\UserInput.cs:line 68
The program '[20556] NAC21_Calculator.exe' has exited with code 0 (0x0).
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
对象定义:
public class UserSoft
{
public List<string> PlatForm { get; set; }
public List<string> Version { get; set; }
public List<software> SOFTWARE { get; set; }
public class software
{
public string NAME { get; set; }
public string VERSION { get; set; }
public string Customized { get; set; }
}
}
并在按下按钮时执行反序列化:
private void GenerateBut_click(object sender, EventArgs e)
{
UserSoft obj = YamlImporter.Deserialize("file_template.yml");
Console.WriteLine("Platform: {0}", obj.PlatForm);
Console.WriteLine("Version: {0}", obj.Version);
foreach (var soft in obj.SOFTWARE)
Console.WriteLine("Software: {0}", soft);
}
catch (Exception Ex)
{
Console.WriteLine(Ex.ToString());
}
}
public class YamlImporter
{
public static UserSoft Deserialize(string yamlName)
{
StreamReader sr = new StreamReader(yamlName);
string text = sr.ReadToEnd();
var input = new StringReader(text);
var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
UserSoft deserializeObject = deserializer.Deserialize<UserSoft>(input); /* compile error */
return deserializeObject;
}
}
我是 C# 的新手,这个问题是唯一真正阻碍我的问题。 提前致谢。
这里有一些问题。
首先,您的 PlatForm
和 Version
属性是 List<string>
类型,但值只是一个字符串。
其次,您的 SOFTWARE
属性 不代表列表,而是地图 - 字符串“Software-01”和“Software-02”实际上是地图中的键。
第三,您已明确声明要使用驼峰命名约定进行反序列化,但您的 YAML 实际上并未使用该约定。
这是一个最小的完整示例,其中更正了这些方面:
using System;
using System.Collections.Generic;
using System.IO;
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);
Console.WriteLine($"Platform: {deserialized.PlatForm}");
Console.WriteLine($"Version: {deserialized.Version}");
foreach (var pair in deserialized.SOFTWARE)
{
var value = pair.Value;
Console.WriteLine($"{pair.Key}: Name={value.NAME}; Version={value.VERSION}; Customized={value.Customized}");
}
}
}
输出:
Platform: windows
Version: 10
Software-01: Name=MFS2020; Version=1.12.2015; Customized=true
Software-02: Name=DCS; Version=6; Customized=false
顺便说一句,我强烈建议您尽量保持大小写一致,并遵循 .NET 命名约定。