我如何告诉MongoDB C#驱动将所有Nullable<Guid>以字符串格式存储?

问题描述 投票:0回答:1

为了将Guid序列化为字符串,我没有任何问题,因为我正在使用这段代码。https:/stackoverflow.coma332581684148788。

    var pack = new ConventionPack { new GuidAsStringRepresentationConvention () };
ConventionRegistry.Register("GuidAsString", pack, t => t == typeof (MyClass));

public class GuidAsStringRepresentationConvention : ConventionBase, IMemberMapConvention
    {
        public void Apply(BsonMemberMap memberMap)
        {
            if (memberMap.MemberType == typeof(Guid))
            {
                var serializer = memberMap.GetSerializer();
                var representationConfigurableSerializer = serializer as IRepresentationConfigurable;
                if (representationConfigurableSerializer != null)
                {
                    var reconfiguredSerializer = representationConfigurableSerializer.WithRepresentation(BsonType.String);
                    memberMap.SetSerializer(reconfiguredSerializer);
                }
            }
        }
    }

如果我尝试对Guid做同样的事情,它就不工作了。

            if (memberMap.MemberType == typeof(Guid?))
            {
                var serializer = memberMap.GetSerializer();
                var representationConfigurableSerializer = serializer as IRepresentationConfigurable;
                if (representationConfigurableSerializer != null)
                {
                    var reconfiguredSerializer = representationConfigurableSerializer.WithRepresentation(BsonType.String);
                    memberMap.SetSerializer(reconfiguredSerializer);
                }
            }

这一行总是空的。

                var representationConfigurableSerializer = serializer as IRepresentationConfigurable;

对于可空的Guid,你是怎么做的?

c# mongodb serialization mongodb-.net-driver
1个回答
0
投票

你是需要重新配置当前的序列器还是可以直接替换掉,替换掉会更简单。

可空类型的BSON序列器被包装在一个装饰器序列器类型(NullableSerializer<>),我们可以只检查 MemberTypeNullable<Guid> 并为你的方案设置正确的序列器。

请看下面的约定代码。

public class GuidAsStringRepresentationConvention : ConventionBase, IMemberMapConvention
{
    public void Apply(BsonMemberMap memberMap)
    {
        if (memberMap.MemberType == typeof(Guid))
        {
            memberMap.SetSerializer(new GuidSerializer(BsonType.String));
        }
        else if (memberMap.MemberType == typeof(Guid?))
        {
            memberMap.SetSerializer(new NullableSerializer<Guid>(new GuidSerializer(BsonType.String)));
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.