繁体   English   中英

BsonExtraElements字典 <string, Object> 和自定义类,因为值无法序列化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM