【问题标题】:Custom BsonSerializer for generic value types通用值类型的自定义 BsonSerializer
【发布时间】:2020-10-17 06:49:40
【问题描述】:

我写了一个自定义的 Bson 序列化器属性。

当传递给 Serialize 方法的值是 ValueKind "Object" 时,它可以正常工作。

但如果 ValueKind 是任何其他数据类型,如字符串、int、bool 等,则会出现“无法从 BsonType 字符串反序列化 BsonDocument”的错误

如何使其适用于所有数据类型并使用属性进行装饰。

型号:

[BsonSerializer(typeof(CustomSerialize))]
[BsonElement("response")]
public object response { get; set; }   

CustomSerialize 类:

   public class CustomSerialize : SerializerBase<Object>
    {
        public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
        {
            var element = (JsonElement)value;
            BsonDocument document = BsonDocument.Parse(element.GetRawText());
            var serializer = BsonSerializer.LookupSerializer(typeof(BsonDocument));
            serializer.Serialize(context, document.AsBsonValue);
        }

        public override object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
        {
            var serializer = BsonSerializer.LookupSerializer(typeof(BsonDocument));
            var document = serializer.Deserialize(context, args);
            var bsonDocument = document.ToBsonDocument();
            var result = BsonExtensionMethods.ToJson(bsonDocument);
            return JsonSerializer.Deserialize<object>(result);
        }
    }

【问题讨论】:

    标签: c# mongodb serialization bson


    【解决方案1】:

    你可以在里面使用Json.NET 序列化器:

    using MongoDB.Bson.Serialization;
    using MongoDB.Bson.Serialization.Serializers;
    using Newtonsoft.Json;
    
    namespace Test
    {
        public class CustomSerialize : SerializerBase<object>
        {
            public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
            {
                var json = JsonConvert.SerializeObject(value);
                context.Writer.WriteString(json);
            }
    
            public override object Deserialize(BsonDeserializationContext context,
                BsonDeserializationArgs args)
            {
                var json = context.Reader.ReadString();
                return JsonConvert.DeserializeObject<object>(json);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多