使用 C# 在 MongoDB 中反序列化接口 - 未知的鉴别器值
Deserializing interface in MongoDB using C# - Unknown discriminator value
首先,我使用当前版本的 MongoDB (3.2) 及其 C# 驱动程序 (2.2.3)。
我有以下 类:
public class Item
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
// ... some other properties
public Data Data { get; set; }
}
public class Data
{
public string BaseType { get; set; }
public IBaseData BaseData { get; set; }
}
public interface IBaseData
{
string Name { get; set; }
int Version { get; set; }
IDictionary<string, object> PayloadData { get; }
}
然后我有一些不同的 IBaseData 接口实现:
public class EventData : IBaseData
{
public int Version { get; set; }
public string Name { get; set; }
public IDictionary<string, object> PayloadData { get; set; }
public IDictionary<string, object> Properties { get; set; }
}
public class ExceptionData : IBaseData
{
// Implementation of the interface and some additional properties
}
将 Item-object 存储到 MongoDB 是没有问题的,似乎一切都是正确的。 Mongo 使用 _t
来确定 IBaseData
的类型(例如 EventData
)。当我第一次尝试检索数据时,它工作得很好,这意味着我拥有完整的对象树。 当我重新启动应用程序 并再次post 相同的请求时,出现以下错误:
An error occurred while deserializing the Data property of class Domain.Objects.Item: An error occurred while deserializing the BaseData property of class Domain.Objects.Data: Unknown discriminator value 'EventData'.
删除 Mongo 数据库并启动应用程序后,它又按预期运行了。
Google 给了我不同的方法,但没有任何帮助:
Storing a Dictionary with polymorphic values in mongoDB using C#
Unknown discriminator value 'MyEvent'
Deserialize object as an interface with MongoDB C# Driver
我想使用 属性 注释,例如 [BsonKnownTypes(typeof(Type1), typeof(Type2)]
,但这只适用于 类。
你有什么想法吗?
我通过在 Program.cs(或其他应用程序启动 class)中添加 classmap 部分解决了我的问题:
BsonClassMap.RegisterClassMap<EventData>(cm =>
{
cm.AutoMap();
cm.SetDiscriminator("EventData");
});
BsonClassMap.RegisterClassMap<ExceptionData>(cm =>
{
cm.AutoMap();
cm.SetDiscriminator("ExceptionData");
});
如果有人找到了使用注释的方法,请回答这个问题。
查看 Setting the Discriminator Value section of MongoDB C# Driver documentation on polymorphism,似乎分别用 [BsonDiscriminator("EventData")]
和 [BsonDiscriminator("ExceptionData")]
注释您的 类,应该等同于您的答案中的示例。
首先,我使用当前版本的 MongoDB (3.2) 及其 C# 驱动程序 (2.2.3)。 我有以下 类:
public class Item
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
// ... some other properties
public Data Data { get; set; }
}
public class Data
{
public string BaseType { get; set; }
public IBaseData BaseData { get; set; }
}
public interface IBaseData
{
string Name { get; set; }
int Version { get; set; }
IDictionary<string, object> PayloadData { get; }
}
然后我有一些不同的 IBaseData 接口实现:
public class EventData : IBaseData
{
public int Version { get; set; }
public string Name { get; set; }
public IDictionary<string, object> PayloadData { get; set; }
public IDictionary<string, object> Properties { get; set; }
}
public class ExceptionData : IBaseData
{
// Implementation of the interface and some additional properties
}
将 Item-object 存储到 MongoDB 是没有问题的,似乎一切都是正确的。 Mongo 使用 _t
来确定 IBaseData
的类型(例如 EventData
)。当我第一次尝试检索数据时,它工作得很好,这意味着我拥有完整的对象树。 当我重新启动应用程序 并再次post 相同的请求时,出现以下错误:
An error occurred while deserializing the Data property of class Domain.Objects.Item: An error occurred while deserializing the BaseData property of class Domain.Objects.Data: Unknown discriminator value 'EventData'.
删除 Mongo 数据库并启动应用程序后,它又按预期运行了。
Google 给了我不同的方法,但没有任何帮助:
Storing a Dictionary with polymorphic values in mongoDB using C#
Unknown discriminator value 'MyEvent'
Deserialize object as an interface with MongoDB C# Driver
我想使用 属性 注释,例如 [BsonKnownTypes(typeof(Type1), typeof(Type2)]
,但这只适用于 类。
你有什么想法吗?
我通过在 Program.cs(或其他应用程序启动 class)中添加 classmap 部分解决了我的问题:
BsonClassMap.RegisterClassMap<EventData>(cm =>
{
cm.AutoMap();
cm.SetDiscriminator("EventData");
});
BsonClassMap.RegisterClassMap<ExceptionData>(cm =>
{
cm.AutoMap();
cm.SetDiscriminator("ExceptionData");
});
如果有人找到了使用注释的方法,请回答这个问题。
查看 Setting the Discriminator Value section of MongoDB C# Driver documentation on polymorphism,似乎分别用 [BsonDiscriminator("EventData")]
和 [BsonDiscriminator("ExceptionData")]
注释您的 类,应该等同于您的答案中的示例。