Docs 菜单
Docs 主页
/ / /
C#/.NET
/ /

GUID

在此页面上

  • Overview
  • MongoDB 中的 GUID
  • 序列化 GUID
  • 使用属性进行配置
  • 在代码中配置
  • 序列化对象
  • 更多信息

在本指南中,您可以学习如何序列化全局唯一标识符 (GUID),也称为通用唯一标识符 (UUID)。

提示

ObjectId

在 MongoDB 应用程序中,您可以使用 ObjectID 类型作为文档的唯一标识符。尽可能考虑使用 ObjectId 实例代替 MongoDB 应用程序中的 GUID。

GUID 是一个 16 字节整数,可用作 MongoDB 文档的唯一 ID。以下代码段显示了一个示例 GUID:

00112233-4455-6677-8899-aabbccddeeff

最初,MongoDB 将 GUID 表示为子类型 3BsonBinaryData 值。由于子类型 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 文档。

尽管我们建议对所有新的 BsonBinaryData GUID 使用子类型 4,但一些较旧的 MongoDB 集合可能包含一些使用子类型 3 和另一些使用子类型 4 的 GUID 字段。为了应对这些差异,.NET/C# 驱动程序在单个属性级别处理 GUID 序列化。

.NET/C# 驱动程序使用 GuidRepresentation 枚举来表示不同的 BsonBinaryData 子类型。下表显示了 GuidRepresentation 枚举成员及其对应的 BsonBinaryData 子类型:

GuidRepresentation 成员
BsonBinaryData 子类型

Standard

4

CSharpLegacy

3

JavaLegacy

3

PythonLegacy

3

Unspecified

不适用

注意

CSharpLegacyJavaLegacyPythonLegacy GUID 表示形式都等效于 BsonBinaryData 子类型 3,但使用不同的字节顺序。

以下各节描述了在应用程序中配置 GUID 表示的方式。

如果使用.NET/ C#驱动程序将 C#类自动映射到文档模式,则可以将 BsonGuidRepresentation属性添加到 GUID属性以指定其表示形式。此属性接受来自 GuidRepresentation枚举的值。

下面的代码示例指定 G 属性的 Standard GUID 表示形式:

public class Widget
{
public int Id { get; set; }
[BsonGuidRepresentation(GuidRepresentation.Standard)]
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 文档:

后退

多态对象