GUID
Overview
在本指南中,您可以学习如何序列化全局唯一标识符 (GUID),也称为通用唯一标识符 (UUID)。
MongoDB 中的 GUID
GUID 是一个 16 字节整数,可用作 MongoDB 文档的唯一 ID。以下代码段显示了一个示例 GUID:
00112233-4455-6677-8899-aabbccddeeff
最初,MongoDB 将 GUID 表示为子类型 3 的 BsonBinaryData
值。由于子类型 3 在编码过程中没有标准化 GUID 的字节顺序,因此不同的 MongoDB 驱动程序使用不同的字节顺序对 GUID 进行编码。
以下标签页显示了从上述 GUID 到 BsonBinaryData
子类型 3 的不同驱动程序编码:
33221100-5544-7766-8899-aabbccddeeff
00112233-4455-6677-8899-aabbccddeeff
77665544-3322-1100-ffee-ddccbbaa9988
为了标准化跨应用程序的 GUID 字节顺序,我们添加了 BsonBinaryData
子类型 4,其中所有 MongoDB 驱动程序都以相同的方式编码。如果您的应用程序使用 GUID,我们建议使用 BsonBinaryData
子类型 4 来存储它们。
有关所有 BsonBinaryData
子类型的列表,请参阅 BsonBinarySubType 枚举的 API 文档。
序列化 GUID
尽管我们建议对所有新的 BsonBinaryData
GUID 使用子类型 4,但一些较旧的 MongoDB 集合可能包含一些使用子类型 3 和另一些使用子类型 4 的 GUID 字段。为了应对这些差异,.NET/C# 驱动程序在单个属性级别处理 GUID 序列化。
.NET/C# 驱动程序使用 GuidRepresentation
枚举来表示不同的 BsonBinaryData
子类型。下表显示了 GuidRepresentation
枚举成员及其对应的 BsonBinaryData
子类型:
GuidRepresentation 成员 | BsonBinaryData 子类型 |
---|---|
| 4 |
| 3 |
| 3 |
| 3 |
| 不适用 |
注意
CSharpLegacy
、JavaLegacy
和 PythonLegacy
GUID 表示形式都等效于 BsonBinaryData
子类型 3,但使用不同的字节顺序。
以下各节描述了在应用程序中配置 GUID 表示的方式。
使用属性进行配置
如果使用.NET/ C#驱动程序将 C#类自动映射到文档模式,则可以将 BsonGuidRepresentation
属性添加到 GUID属性以指定其表示形式。此属性接受来自 GuidRepresentation枚举的值。
下面的代码示例指定 G
属性的 Standard
GUID 表示形式:
public class Widget { public int Id { get; set; } [ ] public Guid G { get; set; } }
在代码中配置
如果您正在编写自己的序列化代码,则可以使用 GuidSerializer
类对 BSON 字段中的各个 GUID 值进行序列化和反序列化。为了确保驱动程序正确处理 GUID,在构建 GuidSerializer
时使用 GuidRepresentation
参数。
以下代码示例创建 GuidSerializer
类的实例,用于序列化使用 BsonBinaryData
子类型 4 的属性:
var guidSerializer = new GuidSerializer(GuidRepresentation.Standard);
如果您的大多数 GUID 使用相同的表示,您可以全局注册 GuidSerializer
。要创建并注册 GuidSerializer
,在应用程序的早期运行以下代码,例如在快速启动阶段:
BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
提示
当使用两个 BsonBinaryData
子类型时,您可以将全局序列化器与 BsonGuidRepresentation
属性结合起来。例如,您可以为最常用的 GUID 子类型注册全局序列化器,然后使用 BsonGuidRepresentation
属性表示另一个子类型的任何 GUID 属性。
重要
如果不在全局注册序列化器,则必须将 BsonGuidRepresentation
属性应用于每个可序列化的 GUID 属性。否则,驱动程序会在尝试序列化属性时引发异常。
序列化对象
您可以使用 ObjectSerializer
将层级对象序列化为子文档。为了确保在序列化和反序列化这些对象中的 GUID 时不会出错,在构建 ObjectSerializer
时选择正确的 GUID 表示。
以下代码示例展示如何为子类型 4 的 GUID 表示创建 ObjectSerializer
:
var objectDiscriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(object)); var objectSerializer = new ObjectSerializer(objectDiscriminatorConvention, GuidRepresentation.Standard);
如果您的应用程序依赖 ObjectSerializer
序列化任何 GUID,您还必须在应用程序的早期注册序列化器,例如在快速启动阶段。每当需要对象序列化器且未另行指定时,您注册的序列化器将在全局范围内使用。
要注册您的 ObjectSerializer
,将其传递给 BsonSerializer.RegisterSerializer()
方法:
var objectDiscriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(object)); var objectSerializer = new ObjectSerializer(objectDiscriminatorConvention, GuidRepresentation.Standard); BsonSerializer.RegisterSerializer(objectSerializer);
更多信息
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: