如何将BsonDocument对象反序列化回类
本文关键字:反序列化 对象 BsonDocument | 更新日期: 2023-09-27 18:26:04
从服务器获取BsonDocument对象后,如何将其反序列化回类?
QueryDocument _document = new QueryDocument("key", "value");
MongoCursor<BsonDocument> _documentsReturned = _collection.FindAs<BsonDocument>(_document);
foreach (BsonDocument _document1 in _documentsReturned)
{
//deserialize _document1
//?
}
我是否使用BsonReader进行反序列化?
实际上有三种方法:
1.指定要在FindAs<>
中直接加载的类型
var docs = _collection.FindAs<MyType>(_document);
2.通过BsonSerializer
:反序列化文档
BsonSerializer.Deserialize<MyType>(doc);
3.手动将bson文档映射到您的班级:
var myClass = new Mytype();
myClass.Name = bsonDoc["name"].AsString;
在大多数情况下,你可以接受第一种方法。但有时,当您的文档是非结构化的时,您可能需要第三种方法。
对于具有一些结构化数据的大型应用程序,建议在创建和获取数据时使用自定义模型,而不是使用BsonDocument。
创建模型是反序列化的重要步骤。
创建模型时需要记住的有用注释:
- 在模型中添加
id
属性。尝试使用[BsonId]
属性进行良好实践: - 创建一个注释为
[BsonExtraElements]
的属性,该属性将用于保存反序列化过程中发现的任何额外元素 - 您可以使用
[BsonElement]
来指定elementName [BsonIgnoreIfDefault]
-初始化BsonIgnoreIfDefaultAttribute类的新实例
示例模型结构,其中我试图涵盖最大情况。为了更好的体系结构,我为_id属性创建了一个基类,但您也可以直接在MyModel
类中使用。
public abstract class BaseEntity
{
// if you'd like to delegate another property to map onto _id then you can decorate it with the BsonIdAttribute, like this
[BsonId]
public string id { get; set; }
}
public class MyModel: BaseEntity
{
[BsonElement("PopulationAsOn")]
public DateTime? PopulationAsOn { get; set; }
[BsonRepresentation(BsonType.String)]
[BsonElement("CountryId")]
public int CountryId { get; set; }
[Required(AllowEmptyStrings = false)]
[StringLength(5)]
[BsonIgnoreIfDefault]
public virtual string CountryCode { get; set; }
[BsonIgnoreIfDefault]
public IList<States> States { get; set; }
[BsonExtraElements]
public BsonDocument ExtraElements { get; set; }
}
现在去沙漠化,直接使用你的模型,同时调用FindAsync
,如下所示:
cursor = await _collection.FindAsync(filter,
new FindOptions<MyModel, MyModel>()
{ BatchSize = 1000, Sort = sort }, ct);