将 Dictionary 序列化为 BSON 时出现 BsonSerializationException

2024-03-09

我最近搬到了新的 MongoDB C# 驱动程序 v2.0 https://www.nuget.org/packages/MongoDB.Driver/2.0.0来自已弃用 v1.9 https://www.nuget.org/packages/mongocsharpdriver/2.0.0.

现在,当我序列化具有字典的类时,有时会遇到以下情况BsonSerializationException:

MongoDB.Bson.BsonSerializationException:使用 DictionaryRepresentation.Document 时,键值必须序列化为字符串。

这是一个最小的重现:

class Hamster
{
    public ObjectId Id { get; private set; }
    public Dictionary<DateTime,int> Dictionary { get; private set; }
    public Hamster()
    {
        Id = ObjectId.GenerateNewId();
        Dictionary = new Dictionary<DateTime, int>();
        Dictionary[DateTime.UtcNow] = 0;
    }
}
static void Main()
{
    Console.WriteLine(new Hamster().ToJson());
}

问题是新驱动程序默认将字典序列化为文档。

MongoDB C# 驱动程序有 3 种方法来序列化字典:Document, ArrayOfArrays & ArrayOfDocuments (文档中有更多相关内容 http://mongodb.github.io/mongo-csharp-driver/2.2/reference/bson/mapping/#dictionary-serialization-options)。当它序列化为文档时,字典键是 BSON 元素的名称,它有一些限制(例如,正如错误所示,它们必须序列化为字符串)。

在这种情况下,字典的键是DateTimes 没有序列化为字符串,而是序列化为Date所以我们需要选择另一个DictionaryRepresentation.

要更改此特定属性的序列化,我们可以使用BsonDictionaryOptions具有不同的属性DictionaryRepresentation:

[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
public Dictionary<DateTime, int> Dictionary { get; private set; }

但是,我们需要对每个有问题的成员单独执行此操作。要应用此DictionaryRepresentation对于所有相关成员,我们可以实施一项新公约:

class DictionaryRepresentationConvention : ConventionBase, IMemberMapConvention
{
    private readonly DictionaryRepresentation _dictionaryRepresentation;
    public DictionaryRepresentationConvention(DictionaryRepresentation dictionaryRepresentation)
    {
        _dictionaryRepresentation = dictionaryRepresentation;
    }
    public void Apply(BsonMemberMap memberMap)
    {
        memberMap.SetSerializer(ConfigureSerializer(memberMap.GetSerializer()));
    }
    private IBsonSerializer ConfigureSerializer(IBsonSerializer serializer)
    {
        var dictionaryRepresentationConfigurable = serializer as IDictionaryRepresentationConfigurable;
        if (dictionaryRepresentationConfigurable != null)
        {
            serializer = dictionaryRepresentationConfigurable.WithDictionaryRepresentation(_dictionaryRepresentation);
        }

        var childSerializerConfigurable = serializer as IChildSerializerConfigurable;
        return childSerializerConfigurable == null
            ? serializer
            : childSerializerConfigurable.WithChildSerializer(ConfigureSerializer(childSerializerConfigurable.ChildSerializer));
    }
} 

我们注册如下:

ConventionRegistry.Register(
    "DictionaryRepresentationConvention",
    new ConventionPack {new DictionaryRepresentationConvention(DictionaryRepresentation.ArrayOfArrays)},
    _ => true);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Dictionary 序列化为 BSON 时出现 BsonSerializationException 的相关文章

  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • Mongoose 独特的验证不起作用。保存重复条目

    我正在开发一个 NodeJS 应用程序 其中express是框架 MongoDB是数据库 我正在使用猫鼬插件 我有一个父母模型 我已经添加了独特 真实到场 mobile 但是每当我添加相同的手机号码时 唯一性验证就会失败 除了保存重复的文档
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • Django:动态构造 {% include %} 标签的值?

    我想用一个 include page html 在我的 Django 模板中标记 并构造值page html动态地 在 Django 中有什么方法可以做到这一点吗 这是一个伪代码示例 include page mode html Thank
  • 如何将 jar、源代码和 Javadoc 添加到本地 Maven 存储库?

    我想添加最新版本的 JGoodies Forms 1 5 0 作为依赖项 但我在主存储库中找不到比 1 0 5 更新的任何内容 所以如果我理解正确 我可以做的下一个最好的事情要做的就是将其添加到我的本地存储库中 当我从网站下载它时 我得到一
  • 使用 React 进行变更检测

    我正在研究更改检测机制 并且在reactjs案例中遇到了一些麻烦 当反应组件中的 props 发生变化时 该组件将被 重新渲染 由于 diff 算法的原因 这并不完全正确 但想法就在这里 我知道当某物发生这种情况时 React 会浏览其内部
  • 如何让 Rails 为 ember.js 生成正确格式的 JSON?

    在 Ember 模型指南中http emberjs com guides models the rest adapter toc relationships http emberjs com guides models the rest a
  • DialogFragment 按钮被推出屏幕 API 24 及更高版本

    我正在定制DialogFragment显示可选择的数据列表 该列表太长 无法在不滚动的情况下显示在屏幕上 对于 API 23 及以下版本 一切似乎都工作正常 但当我在 API 24 上进行测试时 DialogFragment 的按钮不再可见
  • 从 Firebase 数据库获取的数据显示在 3 个单独的警报对话框中,而不是一个

    我正在从中获取一些数据FirebaseDatabase然后将它们放入array然后尝试以List这是一个习惯AlertDialog 这是代码 query mDatabase child child child anotherChild ch
  • Spring MVC 4:“application/json”内容类型未正确设置

    我有一个使用以下注释映射的控制器 RequestMapping value json method RequestMethod GET produces application json ResponseBody public String
  • 如何强制删除Python对象?

    我很好奇的细节 del 在 python 中 何时 为什么应该使用它以及不应该使用它 我经历了惨痛的教训才知道 它并不像人们天真地期望的析构函数那样 因为它并不是与 new init class Foo object def init se
  • Jquery中动态选择Drop Down

    我有 4 个下拉菜单 默认情况下 每个 drop 都有一个 select 选项 每个盒子都有一个唯一的 ID 如您所见 如果上面的下拉列表值为 select 则禁用第二个下拉列表 仅当该值不是 select 时才会启用 这是我的代码 doc
  • Java ImageIO.read 导致 OSX 挂起

    我必须在 Mac OSX 上读取图像时执行一些操作 但是在调用 ImageIO read File 时它似乎挂起 似乎也没有出现堆栈跟踪 它实际上只是挂起 想知道其他人是否遇到过这个问题 我已经成功地写了一张图片 只是阅读方面似乎有问题 使
  • C# 中的双向适配器和可插拔适配器模式有什么区别?

    双向适配器和可插入适配器都可以访问这两个类 并且还可以更改需要更改的方法的行为 以下是我的代码 双向适配器 public interface IAircraft bool Airborne get void TakeOff int Heig
  • 即使删除 Entitlements.plist 后,Xamarin 钥匙串错误中也找不到有效的 iPhone 代码签名密钥

    我收到这个错误即使删除 Entitlements plist 后 Xamarin 钥匙串错误中仍发现 iPhone 代码签名密钥当尝试使用 Xamarin Studios 构建 HelloWorld iPhone 应用程序时 我了解在真实设
  • 使用 jemmy 测试 java web start 应用程序

    我需要使用 Jemmy 创建一些 gui 测试 但我不知道如何使用 javaws 应用程序启动它 在教程 示例 等中是这样的 new ClassReference org netbeans jemmy explorer GUIBrowser
  • Python Pickling 字典 EOFError

    我有几个脚本在服务器上运行 用于腌制和取消腌制各种字典 它们都使用相同的基本代码进行酸洗 如下所示 SellerDict open home hostadl SellerDictkm rb SellerDictionarykm pickle
  • Angular 6 不应用 scss 样式

    我有一个组件页面和相应的样式表 但是 component scss 中的类不适用于该页面 没有错误 我仍然想知道为什么 这是我的产品详细信息 page component html div h1 Product Detail Page h1
  • 向 EditText 字段添加阴影效果

    我正在尝试设计一个编辑文本字段像这样有阴影 底部和右侧 尝试谷歌搜索并搜索了许多SO讨论 但所有讨论都是针对TextView而不是EditText 这是我的代码 向输入文本添加阴影 但不向 TextField 添加阴影
  • 使用 urllib2 HTTPS 登录

    我目前有一个小脚本 可以下载网页并提取一些我感兴趣的数据 没什么花哨的 目前我正在下载页面 如下所示 import commands command wget output document quiet http user USER htt
  • 从共享菜单中泄露 IntentReceiver

    我通过在特定活动中单击按钮来打开发送菜单 Intent i new Intent Intent ACTION SEND i setType text plain i putExtra Intent EXTRA TEXT meh try st
  • 什么是合适的数据结构和数据库模式来存储逻辑规则?

    前言 我没有规则引擎 构建规则 建模规则 实现规则数据结构等方面的经验 因此 我不知道我在做什么 也不知道我下面的尝试是否偏离了基础 我试图弄清楚如何存储和处理以下假设场景 为了简化我的问题 假设我有一种游戏类型 用户购买一个对象 其中可能
  • 将 Dictionary 序列化为 BSON 时出现 BsonSerializationException

    我最近搬到了新的 MongoDB C 驱动程序 v2 0 https www nuget org packages MongoDB Driver 2 0 0来自已弃用 v1 9 https www nuget org packages mo