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 表示为子类型 3 的 BsonBinaryData 值。 由于子类型 3 在编码过程中没有标准化 GUID 的字节顺序,因此不同的 MongoDB 驱动程序使用不同的字节顺序对 GUID 进行编码。

以下标签页显示了上述 GUID 对子类型 3BsonBinaryData 的不同驱动程序编码:

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 的 GUID 字段和其他使用子类型 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# <a class=\" \" href=\" \">驱动程序将 C# 类自动映射到文档模式 ,则可以在BsonGuidRepresentation GUID 属性上添加 属性来指定其表示形式。该属性接受

下面的代码示例指定 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 文档:

后退

多态对象