Как я могу указать драйверу MongoDB C # хранить все Nullable ‹Guids› в строковом формате?

Чтобы сериализовать Guid в строку, у меня нет проблем, поскольку я использую этот код: https://stackoverflow.com/a/33258168/4148788

    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);
                }
            }
        }
    }

Если я попробую сделать то же самое для Гида? это не работает

            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;

Как вы поступаете с гидами, допускающими значение NULL?


person Alex Dguez    schedule 10.06.2020    source источник


Ответы (1)


Вам нужно перенастроить текущий сериализатор или вы можете просто заменить его? заменить было бы проще.

Сериализаторы BSON обнуляемого типа обернуты в тип сериализатора декоратора (NullableSerializer<>). Мы можем просто проверить, MemberType равно Nullable<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)));
        }
    }
}

https://kevsoft.net/2020/06/25/storing-guids-as-strings-in-mongodb-with-csharp.html

person Kevin Smith    schedule 11.06.2020