2016-11-20 81 views
3

我打了一下,用YAML和YamlDotNet错误反序列化YAML与yamldotnet

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

这是我的YAML文件:

--- 
# Folders to secure (with recursive content) 
folders2Secure: 
- .git 
- .vs 

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

相关的C#对象:

public class FolderPreferences 
{ 
    public List<string> Folders2Secure { get; set; } 
    public List<string> Folders2Delete { get; set; } 
} 

有了这个代码把它反序列化:

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; 
    } 
} 

而且我有这样的错误/堆栈种族:

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的六查看该文件。

enter image description here

回答

0

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

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; 
    } 
} 
+0

谢谢,这是问题所在。谢谢。 :-) – ferpega

0

我猜想,有你的文件的开头是被解释为包含一个字符串,因此除了最初的文档额外的内容。检查下面的小提琴,它使用您的代码和按预期工作:

https://dotnetfiddle.net/d72Jut

https://dotnetfiddle.net/tilGHT

然后用这一个,其中附加文本已经在文件开始前加入比较

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

+0

我编辑了问题以添加yaml文件的hexa-image。尽管它在开始时似乎有几个字符,但我试图清理这些字符,但没有运气。 – ferpega

+0

你能上传文件并提供链接吗? –

+0

我已将该文件放在这里:https://expirebox.com/download/4479aa8830f4426f9582670e5d3b12cc.html – ferpega