代码之家  ›  专栏  ›  技术社区  ›  t. YILMAZ

反序列化yaml文件时出错

  •  -1
  • t. YILMAZ  · 技术社区  · 8 年前

    序列化但反序列化抛出错误没有问题,如下所示。我分享了所有相关的课程和错误。我应该做什么来反序列化这个文件。

    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”的实例。“操作”。

    在 YamlDotNet。序列化。对象工厂。DefaultObjectFactory。创建(类型 类型) YamlDotNet。序列化。NodeDeserializers。ObjectNodeSerializer。YamlDotNet。序列化。INodeDeserializer。反序列化(IParser 解析器,类型expectedType,Func'3 NestedObject反序列化器,Object& 值) YamlDotNet。序列化。值反序列化器。NodeValue反序列化器。反序列化值(IParser 解析器,类型expectedType,SerializerState,IValueDeserializer NestedObject反序列化器)

    堆栈跟踪:

       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
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Antoine Aubry    8 年前

    您需要将无参数构造函数添加到 YamlEdit.Operation . YamlDotNet不知道如何传递构造函数参数。