首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用yamldotnet反序列化yaml错误

用yamldotnet反序列化yaml错误
EN

Stack Overflow用户
提问于 2016-11-20 15:48:47
回答 2查看 6.3K关注 0票数 4

我在玩yaml和YamlDotNet的游戏

但我有一个问题,反序列化一些,似乎很容易做到。

这是我的yaml文件:

代码语言:javascript
复制
---
# Folders to secure (with recursive content)
folders2Secure: 
 - .git
 - .vs

folders2Delete: 
 - packages
 - obj
 - bin
 - TestResults
 - node_modules
...

相关的C#对象:

代码语言:javascript
复制
public class FolderPreferences
{
    public List<string> Folders2Secure { get; set; }
    public List<string> Folders2Delete { get; set; }
}

使用此代码将其反序列化:

代码语言:javascript
复制
public class ConfigurationReader
{
    public FolderPreferences Read(string configurationFile)
    {
        var input = new StringReader(configurationFile);
        var deserializerBuilder = new DeserializerBuilder().WithNamingConvention(new CamelCaseNamingConvention());

        var deserializer = deserializerBuilder.Build();

        var result = deserializer.Deserialize<FolderPreferences>(input);
        return result;
    }
}

我有一个错误/堆栈竞赛:

代码语言:javascript
复制
YamlDotNet.Core.YamlException was unhandled
  HResult=-2146233088
  Message=(Line: 1, Col: 1, Idx: 0) - (Line: 1, Col: 19, Idx: 18): Exception during deserialization
  Source=YamlDotNet
  StackTrace:
       at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer) in C:\projects\yamldotnet\YamlDotNet\Serialization\ValueDeserializers\NodeValueDeserializer.cs:line 75
       at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer) in C:\projects\yamldotnet\YamlDotNet\Serialization\ValueDeserializers\AliasValueDeserializer.cs:line 134
       at YamlDotNet.Serialization.Deserializer.Deserialize(IParser parser, Type type) in C:\projects\yamldotnet\YamlDotNet\Serialization\Deserializer.cs:line 315
       at YamlDotNet.Serialization.Deserializer.Deserialize[T](TextReader input) in C:\projects\yamldotnet\YamlDotNet\Serialization\Deserializer.cs:line 257
       at Ebys.CleanFolders.Library.ConfigurationReader.Read[T](String configurationFile) in E:\WorkingGit\bitbucket\CleanFolders\Ebys.CleanFolders.Library\ConfigurationReader.cs:line 21
       at Ebys.CleanFolders.ConsoleUi.Program.Main(String[] args) in E:\WorkingGit\bitbucket\CleanFolders\Ebys.CleanFolders\Program.cs:line 27
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
       HResult=-2147467262
       Message=Invalid cast from 'System.String' to 'Ebys.CleanFolders.Library.FolderPreferences'.
       Source=mscorlib
       StackTrace:
            at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
            at System.String.System.IConvertible.ToType(Type type, IFormatProvider provider)
            at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
            at YamlDotNet.Serialization.Utilities.TypeConverter.ChangeType(Object value, Type destinationType, CultureInfo culture) in C:\projects\yamldotnet\YamlDotNet\Serialization\Utilities\TypeConverter.cs:line 128
            at YamlDotNet.Serialization.NodeDeserializers.ScalarNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func`3 nestedObjectDeserializer, Object& value) in C:\projects\yamldotnet\YamlDotNet\Serialization\NodeDeserializers\ScalarNodeDeserializer.cs:line 96
            at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer) in C:\projects\yamldotnet\YamlDotNet\Serialization\ValueDeserializers\NodeValueDeserializer.cs:line 60
       InnerException: 

知道我做错了什么吗?

编辑的

GVim内的Hexa视图中的文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-23 16:33:41

问题在于您正在创建一个StringReader,它是您指定的字符串的读取器,而不是文件的读取器。您需要使用File.OpenText或类似的API从文件中读取:

代码语言:javascript
复制
public FolderPreferences Read(string configurationFile)
{
    using (var input = File.OpenText(configurationFile))
    {
        var deserializerBuilder = new DeserializerBuilder().WithNamingConvention(new CamelCaseNamingConvention());

        var deserializer = deserializerBuilder.Build();

        var result = deserializer.Deserialize<FolderPreferences>(input);
        return result;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-11-21 17:31:26

我猜想文件开头有额外的内容被解释为包含单个字符串的初始文档,因此出现了异常。检查下面的小提琴,它使用您的代码并按预期工作:

https://dotnetfiddle.net/tilGHT

然后将其与本文档进行比较,其中在文档开始之前添加了其他文本:

https://dotnetfiddle.net/d72Jut

您可以尝试删除初始---,因为它是可选的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40706032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档