【发布时间】:2017-11-28 10:18:49
【问题描述】:
序列化没有问题,但反序列化抛出错误如下。我分享了所有相关的类和错误。我应该怎么做才能反序列化这个文件。
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));
}
}
得到这个错误: (Line: 7, Col: 9, Idx: 86) - (Line: 7, Col: 9, Idx: 86): 反序列化时出现异常
“YamlDotNet”
内部异常:
未能创建“YamlEdit.Operation”类型的实例。
在 YamlDotNet.Serialization.ObjectFactories.DefaultObjectFactory.Create(类型 类型)在 YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser 解析器,类型 expectedType,Func`3 nestedObjectDeserializer,Object& 值)在 YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser 解析器、预期类型、SerializerState 状态、IValueDeserializer 嵌套对象解串器)
堆栈跟踪:
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
【问题讨论】:
-
我认为堆栈跟踪中缺少说明实际问题的部分。
-
添加了 stackTrace
-
构造函数导致错误。当我删除构造函数时,正确反序列化yaml文件。
-
是的,但我认为应该有一些比堆栈跟踪中的反序列化期间异常更具体的错误描述。我可能错了,对 YamlDotNet 没有那么多经验。
-
只是想一想:也许 YamlDotNet 的属性
Operation与类Operation同名存在问题。不太可能,但可能值得一试。
标签: c# serialization deserialization yaml yamldotnet