我正在使用官方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
是否是您一直想要使用的。