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

标签 c# .net mongodb mongodb-.net-driver

我有两个 .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/

相关文章:

c# - GetHostAddresses 不同的错误代码

c# - 比较时间时 DateTimeKind 是否被忽略?

c# - 下载dotnet运行时v7.0.9时VSCode超时错误

javascript - 数字精度如何影响 JavaScript 的性能?

c# - C#/.NET 的惰性流

c# - 带有MVVM的WPF建议文本框

c# - 在动态创建的表中获取动态控制值

c# - 字符串加密/解密密码 c# Metro Style

javascript - 每个任务完成后,如何一遍又一遍地运行异步函数

php - 如何在 laravel 的编辑 View 中更新图像?