2017-11-28 11 views
-1

シリアル化で問題はありませんが、以下のようなスローエラーが発生しました。私はすべての関連するクラスとエラーを共有しました。このファイルを逆シリアル化するにはどうすればよいですか。yamlファイルの逆シリアル化中にエラーが発生しました

(YAMLのシリアライズによって作成された)YAMLファイル:

Edits: 0: 
     Id: 20 
     Type: AddOrUpdate 
     Operation: 
      book: 
      ElementName: a 
      ArithmeticExpression: asd 
      ConditionExpression: a 

C#クラス:

public class DbContext 
     { 
      public Dictionary<int, DbModel> Edits { get; set; } 
     } 



     public class DbModel 
     { 
      public int Id { get; set; } 
      public string Type { get; set; } 
      public Dictionary<string, Operation> Operation { get; set; } 


      public DbModel(int id, string type, Dictionary<string, Operation> op) 
      { 
       Id = id; 
       Type = type; 
       Operation = op; 
      } 
     } 
    public class Operation 
    { 
     public string ElementName { get; set; } 
     public string ArithmeticExpression { get; set; } 
     public string ConditionExpression { get; set; } 

     public Operation(string elemName, string ArithmetticExp, string ConditionExp) 
     { 
      ElementName = elemName; 
      ArithmeticExpression = ArithmetticExp; 
      ConditionExpression = ConditionExp; 
     } 

    } 

class DatabaseOperation 
{ 
    public static DbContext DbContext { get; set; } 
    public const string yamlEditString = "C:\\Data\\setting.yml"; 

    static DatabaseOperation() 
    { 
     DbContext = ReadAllDataFromFile().Result; 
    } 

    public static Task<DbContext> ReadAllDataFromFile() 
    { 
     DbContext dbCon = new DbContext(); 
     if (File.Exists(yamlEditString)) 
     { 

      var deserializer = new Deserializer(); 

      string readedData = File.ReadAllText(yamlEditString); 
      //dbCon.Edits = deserializer.Deserialize<List<DbModel>>(readedData); 
      try 
      { 
       dbCon = deserializer.Deserialize<DbContext>(readedData); 
      } 
      catch (Exception ex) 
      { 

       throw; 
      } 

     } 
     else 
     { 
      dbCon.Edits = new Dictionary<int, DbModel>(); 
     } 
     return Task.FromResult(dbCon); 
    } 
    public static Task WriteAllDataToFile(DbContext dbCon) 
    { 
     var serializer = new Serializer(); 
     File.WriteAllText(yamlEditString, serializer.Serialize(dbCon)); 
    } 
} 

このエラーを取得: (ライン:7、コル:9、IDX:86) - (行:7、列:9、Idx:86):非直列化中の例外

"YamlDotNet"

内部例外:

は型 'YamlEdit.Operation' のインスタンスの作成に失敗しました。 YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser パーサーでYamlDotNet.Serialization.ObjectFactories.DefaultObjectFactory.Create(タイプ タイプ)、タイプexpectedType、Func`3 nestedObjectDeserializerで

、 YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser パーサ、タイプexpectedType、SerializerState状態、IValueDeserializer nestedObjectDeserializer)

で& 値)オブジェクト

のStackTrace:

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.ValueDeserializers.NodeValueDeserializer.<>c__DisplayClass3_0.<DeserializeValue>b__0(IParser r, Type t) 
    at YamlDotNet.Serialization.NodeDeserializers.DictionaryNodeDeserializer.DeserializeHelper(Type tKey, Type tValue, IParser parser, Func`3 nestedObjectDeserializer, IDictionary result) 
    at YamlDotNet.Serialization.NodeDeserializers.DictionaryNodeDeserializer.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) 
    at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer) 
    at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.<>c__DisplayClass3_0.<DeserializeValue>b__0(IParser r, Type t) 
    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) 
    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](String input) 
    at YamlEdit.DatabaseOperation.ReadAllDataFromFile() in D:\Repositories\YamlEdit\DatabaseOperation.cs:line 35 
+0

実際に何がうまくいかなかったかを示すスタックトレースの欠落部分があると思います。 – flyx

+0

added stackTrace –

+0

コンストラクターによってエラーが発生します。コンストラクタを削除すると、yamlファイルを正しく非直列化します。 –

答えて

0

あなたはYamlEdit.Operationにパラメータなしのコンストラクタを追加する必要があります。 YamlDotNetはコンストラクタパラメータを渡す方法を知らない。

関連する問題