8

我正在使用官方 MongoDB 驱动程序 (C#) 实现自定义 IBsonSerializer。我处于必须序列化和反序列化 Guid 的情况。

如果我按如下方式实现 Serialize 方法,它可以工作:

public void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
{
    BsonBinaryData data = new BsonBinaryData(value, GuidRepresentation.CSharpLegacy);
    bsonWriter.WriteBinaryData(data);
}

但是我不希望 Guid 表示为 CSharpLegacy,我想使用标准表示。但是,如果我更改该代码中的 Guid 表示,我会收到以下错误:

MongoDB.Bson.BsonSerializationException:编写器的 GuidRepresentation 是 CSharpLegacy,它要求 subType 参数是 UuidLegacy,而不是 UuidStandard。

如何使用标准表示来序列化 Guid 值?

4

3 回答 3

18

老问题,但万一有人像我一样在谷歌上找到它......

这样做一次:

BsonDefaults.GuidRepresentation = GuidRepresentation.Standard;

例如,在 Web 应用程序/Web API 中,您的Global.asax.cs文件是添加一次的最佳位置

public class WebApiApplication : System.Web.HttpApplication
{
   protected void Application_Start()
   {
      BsonDefaults.GuidRepresentation = GuidRepresentation.Standard;

      //Other code...below

   }
}
于 2014-04-24T16:58:06.533 回答
2

看起来正在发生的事情是当您没有将 GuidRepresentation 显式传递给BsonBinaryData构造函数时,它默认为传递GuidRepresentation.Unspecified并且最终映射到GuidRepresentation.Legacy(参见源代码中的这一行

因此,您需要将 guidRepresentation 作为第三个参数显式传递给 BsonBinaryData 设置为GuidRepresentation.Standard.

编辑:正如稍后指出的那样,您可以设置BsonDefaults.GuidRepresentation = GuidRepresentation.Standard是否始终要使用它。

于 2013-05-05T18:05:38.613 回答
2

如果您不想修改全局设置BsonDefaults.GuidRepresentation(您不应该这样做,因为修改全局变量是一种不好的模式),您可以在创建集合时指定设置:

IMongoDatabase db = ???;
string collectionName = ???;
var collectionSettings = new MongoCollectionSettings {
  GuidRepresentation = GuidRepresentation.Standard
};
var collection = db.GetCollection<BsonDocument>(collectionName, collectionSettings);

然后写入集合的任何 GUID 都将采用标准格式。

请注意,当您从数据库中读取记录时,System.FormatException如果数据库中的 GUID 格式与您的集合设置中的格式不同,您将得到一个。

于 2018-01-19T16:33:34.323 回答