【问题标题】:How to implement IBsonSerializer in dotnet如何在dotnet中实现IBsonSerializer
【发布时间】:2022-01-24 01:35:57
【问题描述】:

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

我像这样注册为提供者:

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

我总是得到一个异常,因为 对象值 在这个方法中总是为空。

我该如何解决这个问题?

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

这是我实现的类。

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

【问题讨论】:

    标签: mongodb .net-core serialization deserialization


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      相关资源
      最近更新 更多