GUIDs
概述
在本指南中,您可以了解如何序列化全局唯一标识符(GUIDs),也称为通用唯一标识符(UUIDs)。
提示
ObjectId
在MongoDB应用程序中,您可以使用ObjectId类型作为文档的唯一标识符。建议在可能的情况下,在MongoDB应用程序中使用ObjectId实例代替GUID。ObjectId
实例。
MongoDB中的GUID
GUID是一个16字节的整数,可以用作MongoDB文档的唯一标识。以下代码块显示了一个GUID的示例
00112233-4455-6677-8899-aabbccddeeff
最初,MongoDB将GUID表示为子类型3。由于子类型3在编码时没有标准化GUID的字节顺序,因此不同的MongoDB驱动程序以不同的字节顺序编码GUID。
以下选项卡显示了将前面的GUID编码为子类型3 BsonBinaryData
的不同驱动程序编码
33221100-5544-7766-8899-aabbccddeeff
00112233-4455-6677-8899-aabbccddeeff
77665544-3322-1100-ffee-ddccbbaa9988
为了在应用程序之间标准化GUID的字节顺序,我们添加了子类型4的BsonBinaryData
,所有MongoDB驱动程序都以相同的方式对其进行编码。如果您的应用程序使用GUID,我们建议使用子类型4的BsonBinaryData
来存储它们。
有关所有BsonBinaryData
子类型的列表,请参阅BsonBinarySubType枚举的API文档。
序列化GUID
尽管我们推荐对所有新的 BsonBinaryData
GUID 使用子类型 4,但一些较旧的 MongoDB 集合可能包含一些使用子类型 3 的 GUID 字段,以及其他使用子类型 4 的字段。为了考虑到这些差异,.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# 类映射到文档模式,您可以为 GUID 属性添加 BsonGuidRepresentation
属性以指定其表示形式。此属性接受来自
以下代码示例指定了 Standard
GUID 表示形式用于 G
属性
public class Widget { public int Id { get; set; } [ ] public Guid G { get; set; } }
在代码中配置
如果您正在编写自己的序列化代码,您可以使用 GuidSerializer
类将单个 GUID 值序列化和反序列化到和从 BSON 字段。为了确保驱动程序正确处理 GUID,请在构建 GuidSerializer
时使用 GuidRepresentation
参数。
以下代码示例创建了一个用于序列化使用 BsonBinaryData
子类型 4 的属性的 GuidSerializer
类的实例
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文档