将GuidRepresentation.Standard与MongoDB一起使用



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

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

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:编写器的指导表示是CSharpLegacy,它要求subType参数为UuidLegacy,而不是UuidStandard。

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

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

执行此操作一次:

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
   }
}
如果不想

修改全局设置BsonDefaults.GuidRepresentation(也不应该修改,因为修改全局是一种不好的模式(,则可以在创建集合时指定设置:

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

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

请注意,从数据库中读取记录时,如果数据库中的 GUID 格式与集合设置中的格式不同,则会System.FormatException

看起来当你没有显式地将 GuidRepresentation传递给BsonBinaryData构造函数时,它默认传递GuidRepresentation.Unspecified并最终映射到GuidRepresentation.Legacy(请参阅源代码中的这一行(

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

编辑:正如后来指出的那样,您可以设置BsonDefaults.GuidRepresentation = GuidRepresentation.Standard是否是您一直想要使用的。

相关内容

  • 没有找到相关文章

最新更新