Pavithra Asked: 2025-02-14 15:22:10 +0800 CST2025-02-14 15:22:10 +0800 CST 2025-02-14 15:22:10 +0800 CST Guid 序列化子类型 772 mongodb guid 表示模式导致了一些问题,在图形 API 中必须将其明确指定为“标准”。 mongodb 6 中默认使用的是什么以及与之关联的 C# 驱动程序是什么? mongodb 8 中的默认设置以及与其关联的 C# 驱动程序是什么? 哪种表现模式最好以及应该使用什么? 更换为新的是否会导致任何向后兼容性问题? mongodb 1 个回答 Voted Best Answer Markus 2025-02-14T16:09:22+08:002025-02-14T16:09:22+08:00 为了阐明这些问题:首先,没有“与 MongoDB 版本关联的 MongoDB C# 驱动程序”。当然,驱动程序版本可能会减少对非常旧的 MongoDB 版本的支持,但当前版本的 MongoDB C# 驱动程序 (v3.1) 支持广泛的 MongoDB 版本。您可以在文档的此部分中检查兼容性。 GUID 表示的问题在于,不久前,特定语言/环境的驱动程序以不同的方式序列化 GUID。因此,Java 驱动程序以与 C# 驱动程序不同的二进制形式编写 GUID。这使得跨语言互操作非常困难;如果您使用 Java 编写了 GUID,则很难用 C# 读取它,反之亦然。 作为一种解决方案,MongoDB 引入了一种用于 GUID 的新二进制子类型 (4),并且以相同的方式在所有语言的驱动程序中实现。 在较新的 C# 驱动程序版本中,MongoDB 已从二进制子类型 3 过渡到二进制子类型 4,但也承认由于 GUID 可以以各种方式写入数据库,因此很难找到默认值。因此,您需要在应用程序中按属性或全局配置 GUID 的序列化。这是一个好消息,因为它最终允许以特定方式处理每个属性,并且如果您的数据库中的 GUID 混合使用子类型 3 和不同语言进行序列化,则可以解决很多问题。 对于新项目,您应始终使用二进制子类型 4 (GuidRepresentation.Standard),因为它是可在所有语言驱动程序上互操作的序列化。如果您访问包含使用二进制子类型 3 编写的 GUID 的现有数据库,则需要配置这些属性以使用相应的 GUID 表示模式,以便能够正确读取/写入数据。 此外,如果您现在决定某个属性使用特定的 GUID 表示模式并在稍后进行更改,则可能会遇到序列化问题。 请参阅此文档以了解如何根据每个属性或全局配置 GUID 的表示模式。
为了阐明这些问题:首先,没有“与 MongoDB 版本关联的 MongoDB C# 驱动程序”。当然,驱动程序版本可能会减少对非常旧的 MongoDB 版本的支持,但当前版本的 MongoDB C# 驱动程序 (v3.1) 支持广泛的 MongoDB 版本。您可以在文档的此部分中检查兼容性。
GUID 表示的问题在于,不久前,特定语言/环境的驱动程序以不同的方式序列化 GUID。因此,Java 驱动程序以与 C# 驱动程序不同的二进制形式编写 GUID。这使得跨语言互操作非常困难;如果您使用 Java 编写了 GUID,则很难用 C# 读取它,反之亦然。
作为一种解决方案,MongoDB 引入了一种用于 GUID 的新二进制子类型 (4),并且以相同的方式在所有语言的驱动程序中实现。
在较新的 C# 驱动程序版本中,MongoDB 已从二进制子类型 3 过渡到二进制子类型 4,但也承认由于 GUID 可以以各种方式写入数据库,因此很难找到默认值。因此,您需要在应用程序中按属性或全局配置 GUID 的序列化。这是一个好消息,因为它最终允许以特定方式处理每个属性,并且如果您的数据库中的 GUID 混合使用子类型 3 和不同语言进行序列化,则可以解决很多问题。
对于新项目,您应始终使用二进制子类型 4 (GuidRepresentation.Standard),因为它是可在所有语言驱动程序上互操作的序列化。如果您访问包含使用二进制子类型 3 编写的 GUID 的现有数据库,则需要配置这些属性以使用相应的 GUID 表示模式,以便能够正确读取/写入数据。
此外,如果您现在决定某个属性使用特定的 GUID 表示模式并在稍后进行更改,则可能会遇到序列化问题。
请参阅此文档以了解如何根据每个属性或全局配置 GUID 的表示模式。