gpt4 book ai didi

Dictionary 的 C# MongoDb 序列化

转载 作者:可可西里 更新时间:2023-11-01 10:50:16 26 4
gpt4 key购买 nike

我的数据库中有一个集合,用于记录事件。每种类型的事件都有不同的数据集。我用以下类定义了它:

[CollectionName("LogEvent")]
public class LogEvent
{
public LogEvent(string eventType)
{
EventType = eventType;
EventData = new Dictionary<string, object>();
}

public string EventType { get; private set; }
[BsonExtraElements]
public IDictionary<string, object> EventData { get; private set; }
}

现在 - 这在某种程度上非常有效。只要 EventData 字典的元素是简单类型...

var event = new LogEvent("JobQueues"){
EventData = new Dictionary<string, object>(){
{ "JobId": "job-123" },
{ "QueueName": "FastLane" }
}
}

_mongoCollection.InsertOne(event);

...我得到像这样的 mongo 文档

{
_id: ObjectId(...),
EventType: "JobQueued",
JobId: "job-123",
QueueName: "FastLane"
}

但是当我尝试向字典中添加自定义类型时,事情就停止了。

var event = new LogEvent("JobQueues"){
EventData = new Dictionary<string, object>(){
{ "JobId": "job-123" },
{ "QueueName": "FastLane" },
{ "JobParams" : new[]{"param-1", "param-2"}},
{ "User" : new User(){ Name = "username", Age = 10} }
}
}

这给了我类似 的错误。NET 类型 ... 无法映射到 BsonType。

如果我删除 [BsonExtraElements] 标签和 [BsonDictionaryOptions(DictionaryRepresentation.Document)] 它将开始无错误地序列化内容,但它会给我一个完整的我不喜欢的不同文档..

{
_id: ObjectId(...),
EventType: "JobQueued",
EventData: {
JobId: "job-123",
QueueName: "FastLane",
User: {
_t: "User",
Name: "username",
Age: 10
},
JobParams : {
_t: "System.String[]",
_v: ["param-1", "param-2"]
}
}
}

我想要的是下面的结果:

{
_id: ObjectId(...),
EventType: "JobQueued",
JobId: "job-123",
QueueName: "FastLane",
User: {
Name: "username",
Age: 10
},
JobParams : ["param-1", "param-2"]
}

有人知道如何实现吗?

(我使用的是 C# mongodriver v2.3)

最佳答案

MongoDriver 也是如此,因为它需要类型的信息来反序列化。您可以做的是为用户类编写和注册您自己的 CustomMapper:

public class CustomUserMapper : ICustomBsonTypeMapper
{
public bool TryMapToBsonValue(object value, out BsonValue bsonValue)
{
bsonValue = ((User)value).ToBsonDocument();
return true;
}
}

启动程序的某处:

BsonTypeMapper.RegisterCustomTypeMapper(typeof(User), new CustomUserMapper());

那行得通,而且我已经成功地按照您的要求序列化了您的数据。

但是:因为你想反序列化它,你会得到你的 User 类作为 Dictionary,因为驱动程序没有关于hiow反序列化它:

enter image description here

关于Dictionary<string, object> 的 C# MongoDb 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41875032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com