gpt4 book ai didi

c# - 为 MongoDb 处理可为空和不可为空类型的自定义序列化程序

转载 作者:行者123 更新时间:2023-12-03 23:17:07 25 4
gpt4 key购买 nike

我需要使用 IBsonSerializer 实现自定义序列化程序。

这就是我所做的:

internal class MyCustomDateTimeSerializer : IBsonSerializer
{
public object Deserialize(BsonDeserializationContext context,
BsonDeserializationArgs args)
{
// Deserialization logic
}

public void Serialize(BsonSerializationContext context,
BsonSerializationArgs args, object value)
{
// Serialization logic
}

public Type ValueType => typeof(DateTime);
}

然后在 BsonSerializerAttribute 中使用它:
[BsonSerializer(typeof(MyCustomDateTimeSerializer))]

我的问题是我想序列化/反序列化 DateTime 和 Nullable DateTime。

我的 CustomSerializer 的 ValueType 设置为 typeof(DateTime),因此我得到如下异常:

Value type of serializer is System.DateTime and does not match member type System.Nullable`1[[System.DateTime..



我没有找到针对此问题的任何解决方案。
当然,我可以为 Nullable DateTime 和 DateTime 创建两个不同的类,但也许还有另一种选择?

最佳答案

如果查看SetSerializer的源代码MongoDB.Bson 库中的方法,您将看到它对成员类型进行了非常简单的检查:

if (serializer.ValueType != _memberType)
{
var message = string.Format("Value type of serializer is {0} and does not match member type {1}.", serializer.ValueType.FullName, _memberType.FullName);
throw new ArgumentException(message, "serializer");
}

代码检查类型相等性,没有办法欺骗它并让人认为 DateTimeNullable<DateTime>是平等的。

但是,您可以使用一种解决方案来拥有一个序列化程序类并避免重复代码。你可以让你的序列化器成为一个通用类并强制它只接受 DateTimeNullable<DateTime>作为类型参数。
这是一个示例:
internal class MyCustomDateTimeSerializer<TDateTime> : IBsonSerializer
{
static MyCustomDateTimeSerializer()
{
if (typeof(TDateTime) != typeof(DateTime) && typeof(TDateTime) != typeof(DateTime?))
{
throw new InvalidOperationException($"MyCustomDateTimeSerializer could be used only with {nameof(DateTime)} or {nameof(Nullable<DateTime>)}");
}
}

public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
// Deserialization logic
}

public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
{
// Serialization logic
}

public Type ValueType => typeof(TDateTime);
}

public class SomeDocument
{
// ...

[BsonSerializer(typeof(MyCustomDateTimeSerializer<DateTime>))]
public DateTime Date1 { get; set; }

[BsonSerializer(typeof(MyCustomDateTimeSerializer<DateTime?>))]
public DateTime? Date2 { get; set; }
}

关于c# - 为 MongoDb 处理可为空和不可为空类型的自定义序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48689561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com