gpt4 book ai didi

c# - MongoDB 驱动程序 2.2 的动态类型 - 如何不序列化 _t 类型鉴别器?

转载 作者:行者123 更新时间:2023-12-05 07:49:37 26 4
gpt4 key购买 nike

我有两个 .Net (C#) 应用程序通过 Mongo 传递“消息”。一个是作家,另一个是读者_t 类型鉴别器导致我出现反序列化问题。

这是他们用来通信的通用类的简化版本:

public class MyMessage {
public long Id {get; set;}
public string MessageText {get; set;}
public dynamic OriginalObject{get; set;}
}

Writer 应用实际上是通过映射Reader 应用未知的其他类型的值来创建 MyMessage 的实例。它映射出已知的公共(public)元素,然后将整个原始对象分配给动态的 OriginalObject 属性。

public MyMessage CreateMessage(SomeOtherType originalMsg) {
return new MyMessage {
MessageText = originalMsg.SomeField,
OriginalObject = originalMsg
};
}

当 .Net Mongo 驱动程序序列化 MyMessage 时,它会将 _t 类型鉴别符添加到 OriginalObject 子文档。

但是,Reader 应用并未引用Writer 引用的所有类型。当 Reader 应用程序尝试反序列化 MyMessage 时,只要 OriginalObject 是它的类型,它就会抛出 Unknown discriminator value 错误没有。

我读到,只要实际类型与标称类型不匹配,就会添加 _t 类型鉴别器。这在真正的多态、强类型场景中是有意义的。但现在 C# 具有动态类型,我想使用它。

此外,如果 MyMessage.OriginalMessage 的实例是纯匿名类型,它也能完美运行。没有编写 _t 类型鉴别器。 Reader 应用愉快地将其反序列化为动态 (expando) 对象,一切正常。只有当 OriginalMessage 的实例是某种强类型时,我才会遇到这个问题。

如何告诉 Mongo 驱动程序不要为动态类型添加 _t 类型鉴别器?我也对其他解决方案/解决方法感兴趣,但简单地排除 _t 将是我的首选方法。

.Net Framework 4.6.1, MongoDB.Driver 2.2.3

更多示例代码:

public void SaveMessages()
{
var message1 = new MyMessage {
Id=1,
MessageText="Anonymous Message",
OriginalMessage=new{ Field1 = "f1", Field2 = "f2" }
};
_collection.InsertOne(message1); // no _t since OriginalMessage is purely anonymous

var message2 = new MyMessage {
Id=2,
MessageText="Strong Message",
OriginalMessage=new SomeOtherType{Prop1="p1", Prop2="p2"}
};
_collection.InsertOne(message2); // has _t since SomeOtherType is not "dynamic"
}

最佳答案

您可以使用 Project 在获取时排除项目,如下所示:

return await this.GetCollection()
.Find(filter: new BsonDocument("_id", handle))
.Project(Builders<BsonDocument>.Projection.Exclude("_t"))
.FirstAsync();

关于c# - MongoDB 驱动程序 2.2 的动态类型 - 如何不序列化 _t 类型鉴别器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37164317/

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