如何告诉MongoDB C#驱动程序以字符串格式存储所有Guid?

Mar*_*ulz 4 serialization mongodb mongodb-.net-driver

我目前正在将该[BsonRepresentation(BsonType.String)]属性应用于Guid我的域模型中的所有属性,以便以字符串格式序列化这些属性.除了令人厌倦之外,有时候这种情况并不常见,例如使用自定义Wrapper<T>类:

public class Wrapper<T>
{
    public T Value { get; set; }

    // Further properties / business logic ...
}
Run Code Online (Sandbox Code Playgroud)

TGuid时,Value属性将被存储为类型的二进制数据UuidLegacy(如将类型的任何属性Guid,这不是装饰与上述属性).但是,我希望所有Guids,包括Wrapper<Guid>.Value在数据库中表示为字符串.

有没有办法告诉MongoDB C#驱动程序以Guid字符串格式存储所有s?

Ale*_*lex 6

这可以使用约定来实现

有点像:

var myConventions = new ConventionProfile();
myConventions.SetSerializationOptionsConvention(
    new TypeRepresentationSerializationOptionsConvention(typeof (Guid), BsonType.String));

BsonClassMap.RegisterConventions(myConventions, t => t == typeof (MyClass));
Run Code Online (Sandbox Code Playgroud)

这应该在您的应用启动中的某个地方.

您可以在这里阅读更多有关约定的内容:http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-Conventions

  • 现在已经过时,但感谢指针.RegisterConventions被ConventionRegistry.Register取代 (3认同)

Aar*_*nHS 5

可以通过简单地调用一行代码来完成在不设置 a 的情况下全局执行此操作的另一种方法Convention(鉴于实际问题是有效的:“如何在全局范围内应用” ,我认为这有点矫枉过正):

BsonSerializer.RegisterSerializer(typeof(Guid), 
    new GuidSerializer(BsonType.String));
Run Code Online (Sandbox Code Playgroud)

只要确保这是根据 MongoDb 的序列化配置触发的第一件事(即使在注册类映射之前,发布的基于约定的解决方案也是如此)。

就我个人而言,我认为这是比创建带有“始终返回真”谓词的约定更好的解决方案,这似乎是大多数人的建议。约定非常适用于更复杂的场景,以及对实际使用谓词的序列化配置集进行分组,并将多个Conventions捆绑到一个ConventionPack. 但是对于简单地应用全局序列化格式,只需使用上面的代码行保持简单。

如果你后来决定你有一个合法的Convention需要这个规则的变体,只需注册它以覆盖我们设置的全局规则,就像你Convention会覆盖默认的全局规则一样,它被设置为Guid's表示为BsonType.Binary。最终结果将是全局规则优先,然后是Convention,它只会在自定义ConventionPack适用的情况下覆盖我们的自定义全局规则(基于您的自定义谓词)。