[英]BsonExtraElements Dictionary<string, Object> and custom classes as value fails serialization
具有以下课程:
public class Article
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Name { get; set; }
[BsonExtraElements()]
public Dictionary<string, Object> OtherData { get; set; }
}
我想将此对象添加到字典中并写入数据库:
public class Bird
{
[BsonElement("_n")]
[BsonRequired]
public string Name { get; set; }
[BsonElement("_s")]
[BsonRequired]
public string Species { get; set; }
[BsonElement("_a")]
[BsonRequired]
public int Age { get; set; }
}
var col = db.GetCollection<Article>("articles");
var art = new Article
{
Name = "Blu"
};
art.OtherData = new System.Collections.Generic.Dictionary<string, object>()
{
{ "bird" , new Bird { Name = "Jerry", Age = 4, Species = "European starling" } }
};
col.InsertOne(art);
但是,此操作失败,并出现以下异常:System.ArgumentException:'.NET类型Bird无法映射到BsonValue'
如果删除[BsonExtraElements]
属性,一切都会正常,并且文章最终会出现在数据库中。 为什么是这样? 该属性如何防止序列化? 因为属性不存在,所以我的这个自定义类可以由驱动程序序列化。
使用驱动程序版本2.4.4
官方文档( http://mongodb.github.io/mongo-csharp-driver/1.11/serialization/ ):
您可以将您的类设计为能够处理反序列化期间在BSON文档中可能发现的任何其他元素。 为此,您必须具有BsonDocument类型的属性,并且必须将该属性标识为应该包含找到的任何其他元素的属性(或者您可以将属性命名为“ ExtraElements”,以便默认的ExtraElementsMemberConvention可以自动找到它) 。
public MyClass {
// fields and properties
[BsonExtraElements]
public BsonDocument CatchAll { get; set; }
}
长话短说,当您使用[BsonExtraElements]标签时,它必须是BsonDocument类型。
干杯!
编辑:我通过添加使它起作用
{ "bird" , new Bird { Name = "Jerry", Age = 4, Species = "European starling" }.ToBsonDocument() }
使用[BsonDictionaryOptions(DictionaryRepresentation.Document)]
代替
public class Article
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Name { get; set; }
[BsonDictionaryOptions(DictionaryRepresentation.Document)]
public Dictionary<string, Object> OtherData { get; set; }
}
这将生成JSON
{
"_id": ObjectId("5a468f3e28fad22e08c4fa6b"),
"Name": "Sanjay",
"OtherData": {
"stringData": "val1",
"boolVal": true,
"someObject": {
"key1": "val1",
"key2": "val2"
},
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.