如何在 dotnet 中实现 IBsonSerializer

How to implement IBsonSerializer in dotnet

我正在使用 MongoDB,我需要创建一个可以作为 提供程序 注入的序列化程序,而无需使用 class 装饰BsonSerializerAttribute.

我这样注册为提供商:

BsonSerializer.RegisterSerializer(typeof(SexType), new SexTypeSerializer());

我总是会遇到异常,因为 对象值 在此方法中始终为 null。

我该如何解决这个问题?

public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)

这是我实现的class。

    public class SexTypeSerializer : IBsonSerializer<SexType>
    {
        public Type ValueType
        {
            get { return typeof(SexType); }
        }

        public SexTypeSerializer() { }

        public SexType Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
        {
            var value = context.Reader.ReadString();

            return SexType.FromCode(value);
        }

        public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, SexType value)
        {
            BsonSerializer.Serialize(context.Writer, value.Code);
        }

        object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
        {
            return SexType.FromCode(BsonSerializer.Deserialize<string>(context.Reader));
        }

        public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
        {
            if (value is SexType sexType)
            {
                BsonSerializer.Serialize(context.Writer, sexType.Code);
            }
            else
            {
                throw new NotSupportedException($"This is not an {nameof(SexType)}");
            }
        }
    }

根据以下重构代码进行以下更改:

    public class SexTypeSerializer : SerializerBase<SexType>
    {
        public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, SexType sexType)
        {
            context.Writer.WriteString(sexType.Code);            
        }

        public override SexType Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
        {
            var code = context.Reader.ReadString();
            
            return SexType.FromCode(code);
        }
    }

在你的 Startup.cs 上这样使用它:

BsonSerializer.RegisterSerializer(new SexTypeSerializer());