2016-11-20 161 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