使用 Mongo C# 驱动程序序列化不可变值类型

2024-02-29

例如,我有许多不可变值类型类EmailAddress,这确保任何非空实例都是有效的。我想将这些类型的对象的序列化控制为标准字符串表示形式("[email protected] /cdn-cgi/l/email-protection") 使用 MongoDB C# 驱动程序进行持久化时。

我尝试过实施IBsonSerilizer但是它只允许根级别的对象或数组。我能够使用 Json.NET 实现正确的 Json 序列化,我应该采取不同的方法吗?


我假设你的意思是这样的 EmailAddress 类:

[BsonSerializer(typeof(EmailAddressSerializer))]
public class EmailAddress
{
    private string _value;

    public EmailAddress(string value)
    {
        _value = value;
    }

    public string Value
    {
        get { return _value; }
    }
}

我使用一个属性将 EmailAddress 类链接到自定义序列化程序,可以按如下方式实现:

public class EmailAddressSerializer : BsonBaseSerializer
{
    public override object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
    {
        if (bsonReader.GetCurrentBsonType() == BsonType.Null)
        {
            bsonReader.ReadNull();
            return null;
        }
        else
        {
            var value = bsonReader.ReadString();
            return new EmailAddress(value);
        }
    }

    public override void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
    {
        if (value == null)
        {
            bsonWriter.WriteNull();
        }
        else
        {
            var emailAddress = (EmailAddress)value;
            bsonWriter.WriteString(emailAddress.Value);
        }
    }
}

您无法将电子邮件地址序列化为根文档(因为它不是文档...)。但是您可以使用嵌入在其他文档中的电子邮件地址。例如:

public class Person
{
    public int Id { get; set; }
    public EmailAddress EmailAddress { get; set; }
}

您可以使用如下代码进行测试:

var person = new Person { Id = 1, EmailAddress = new EmailAddress("[email protected] /cdn-cgi/l/email-protection") };
var json = person.ToJson();
var rehyrdated = BsonSerializer.Deserialize<Person>(json);

生成的 JSON/BSON 文档为:

{ "_id" : 1, "EmailAddress" : "[email protected] /cdn-cgi/l/email-protection" }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Mongo C# 驱动程序序列化不可变值类型 的相关文章

  • std::list::clear 是否会使 std::list::end 迭代器无效?

    检查这个代码 include stdafx h include
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • ReferenceError:MongoDB shell 中未定义 require

    我尝试通过 Windows 命令 Windows 8 1 从 Mongo 客户端连接 MongoDB 当我使用require 在 javascript 中 我遇到如下错误 有人有同样的问题吗 我有错过任何一个吗require有关的npm安装
  • 确定序列化对象的类型

    我需要通过套接字发送消息 从用户到引擎的请求 以及从引擎到用户的响应 所以流程本质上是 serialized request Server lt network gt Client serialized response request r
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • Java/MongoDB 按日期查询

    我将一个值作为 java util Date 存储在我的集合中 但是当我查询以获取两个特定日期之间的值时 我最终得到的值超出了范围 这是我的代码 插入 BasicDBObject object new BasicDBObject objec
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 使用基于关联数组的 UML 建模类型

    假设有一个 PHP 子系统 它仅使用关联数组来存储某种结构化数据 因此 实际上在语言级别上没有机制来约束这些结构 但您希望在设计中使用 UML 来定义它们 E g 在 PHP 中 联系人可能是这样的关联数组 name gt John Doe
  • C++:从模板参数生成字符串文字

    template lt unsigned int i gt struct t static const char s template lt unsigned int i gt const char t i s where 是 0 1 2
  • 将函数定义为 x,y 数据的插值

    我在 data txt 中有 2 列 x y 数据 如下所示 0 0 1 1 2 4 3 9 4 16 5 25 现在我想定义一个函数 f x 其中 x 是第一列 f x 是第二列 然后能够打印该函数的值 如下所示 f 2 这应该给我 4
  • 为什么 isnumeric 不起作用?

    我正在阅读一个非常简单的 python3 指南来使用字符串操作 然后我遇到了这个奇怪的错误 In 4 create string string Let s test this test to see if it is numeric str
  • 删除 C++ 向量中的重复条目

    只是想删除重复项 泳池是vector
  • 如何配置 Visual Studio Code 来解析 AWS Lambda 层的输入路径 (javascript)

    我使用 VS Code 开发 AWS 托管的无服务器应用程序 该应用程序使用 Lambda 最近 我决定开始使用 Lambda Layers 来提取和重用公共代码 我遇到的问题是 AWS Lambda 需要 Lambda 层的以下导入 co
  • PHP MySQL PDO TextArea 带条件检查的Where 子句

    我有一个页面 如下面的屏幕截图所示 这个想法是输入公共汽车号码和特定路线上的所有站点列表 每条线路一个 站点已存储在名为 stops 的数据库表中 我需要文本区域中每个站点的 ID 我当前的代码仅获取文本区域中最后一站的 ID 我觉得我失去
  • 在 MVC 5 中填充 DropDownList

    这是我的代码添加新产品视图模型 using AccessorizeForLess Data using System Collections Generic using System ComponentModel DataAnnotatio
  • numpy datetime64 添加或减去日期间隔

    我正在解析一个巨大的 ascii 文件 其中包含分配给条目的日期 因此 我发现自己使用 datetime 包与 numpy datetime64 并行来添加数组功能 我知道 pandas 包可能是最推荐用于约会的 但是尝试在没有 panda
  • 如何使用 golang 从 Amazon S3 存储桶的子文件夹中获取对象列表?

    如何使用 golang 从 Amazon S3 存储桶的子文件夹中获取对象列表 I tried svc s3 New session New aws Config Region aws String us east 1 params s3
  • 应用内恢复在 Debug 上运行良好,但在 iPhone sdk 中的 AdHoc 上崩溃

    当我单击 恢复 按钮 AdHoc 版本 时 我的应用程序崩溃了 但同一应用程序在调试模式下工作正常 我的代码 SKPaymentQueue defaultQueue restoreCompletedTransactions 崩溃报告 Nov
  • 从 Android 向 PLC 发送布尔值

    我能够与 PLC 建立连接以从中读取数据 现在有一个问题 那就是我必须编写一种方法来修改PLC中的数据 为了实现这一点 我必须向 PLC 发送两个值 一个 int 值和一个 boolean 值 我通过 net wimpi modbus 包中
  • Mp4 视频旋转元数据

    我开发了一个 android ios 视频共享应用程序 可以录制视频并将其上传到亚马逊 s3 为了兼容 android ios 以 mp4 格式录制 H264 AAC 编解码器 用户可以拍摄肖像或风景 应用程序从传感器获取信息 设置文件的旋
  • 无效的规格缓存文件

    我在 Windows 8 上安装了 ruby 2 0 0p247 x64 mingw32 和 Gem 2 2 2 我有一个持续存在的问题 gem 导致它几乎无法使用 每当我尝试安装新的 gem 时 我总是会得到 ERROR While ex
  • Python如何将数据帧的两列组合成一个列表?

    我有一个数据框 如下所示 df index data1 data2 0 20 120 1 30 456 2 40 34 如何将上面 df 中的两列组合成一个列表 使得第一行元素先出现 然后是第二行 我的预期输出 my list 20 120
  • Laravel 5.2:Flash 没有定义的提示路径

    我试图在安装 laracasts flash 1 3 包后创建一个视图 这是我的代码 include gazett errors 在blade php文件的 gazett errors 中找到以下代码 div class row div c
  • Visual C++ 函数突然变慢 170 毫秒(长 4 倍)

    在过去的几个月里 我一直致力于一个 Visual C 项目 从相机中获取图像并进行处理 到目前为止 更新数据大约需要 65 毫秒 但现在突然显着增加 发生的情况是 我启动程序 在前 30 次左右的迭代中 它按预期执行 然后循环时间突然从 6
  • 使用 Azure Durable Functions 实现“即发即忘”后台作业

    我有一个用例 要求我启动一些 Azure Durable Functions 而不关心其结果 我想知道我的方法是否正确 这是我所处的场景 功能A使用一个HttpTrigger 功能B使用一个ActivityTrigger 这是我的工作流程
  • PHP中如何对多个数组进行排序

    我已经编写了一个脚本来生成数据数组 但现在想按分数顺序显示 数组输出如下 display name gt Array 0 gt ACT Web Designs 1 gt user1 design 2 gt user2 design prof
  • 使用 Mongo C# 驱动程序序列化不可变值类型

    例如 我有许多不可变值类型类EmailAddress 这确保任何非空实例都是有效的 我想将这些类型的对象的序列化控制为标准字符串表示形式 email protected cdn cgi l email protection 使用 Mongo