2 回答

TA贡献1853条经验 获得超9个赞
如果有人正在阅读这篇文章并遇到同样的问题,那么实际上有一种方法可以在不实现自己的序列化程序的情况下做到这一点。不过,这是 2.x 版本的驱动程序。
默认情况下,mongo 将NullableSerializer<T>用于您的DateTime?字段,但默认情况下没有设置 dateOnly。但是,NullableSerializer<T>只需为该<T>类型包装一个普通的序列化程序,并且有一种方法可以为其提供您自己配置为使用 dateOnly 的实例:
var dateSerializer = new DateTimeSerializer(dateOnly: true);
var nullableDateOnlySerializer = new NullableSerializer<DateTime>().WithSerializer(dateSerializer));
BsonClassMap.RegisterClassMap<MyModel>(cm =>
{
cm.AutoMap();
cm.MapMember(c => c.X).SetSerializer(nullableDateOnlySerializer);
});

TA贡献1155条经验 获得超0个赞
实际上,我如何实现序列化程序是问题所在,在进行了一些修复后,它可用于任何可为空的 DateTime 属性(DateTime?)并接受与中相同的构造函数参数DateTimeSerializer(但由于某种原因不适用于 DateTime 类型):
public class DateTimeNullableSerializer : IBsonSerializer
{
public Type ValueType { get; }
private DateTimeSerializer dateTimeSerializer;
/// <summary>
/// Initializes a new instance of the <see cref="T:DateTimeNullableSerializer" /> class.
/// </summary>
public DateTimeNullableSerializer()
{
ValueType = typeof(DateTime?);
dateTimeSerializer = new DateTimeSerializer(DateTimeKind.Utc, BsonType.DateTime);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:DateTimeNullableSerializer" /> class.
/// </summary>
/// <param name="dateOnly">if set to <c>true</c> [date only].</param>
public DateTimeNullableSerializer(bool dateOnly)
{
ValueType = typeof(DateTime?);
dateTimeSerializer = new DateTimeSerializer(dateOnly);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:DateTimeNullableSerializer" /> class.
/// </summary>
/// <param name="dateOnly">if set to <c>true</c> [date only].</param>
/// <param name="representation">The representation.</param>
public DateTimeNullableSerializer(bool dateOnly, BsonType representation)
{
ValueType = typeof(DateTime?);
dateTimeSerializer = new DateTimeSerializer(dateOnly, representation);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:DateTimeNullableSerializer" /> class.
/// </summary>
/// <param name="representation">The representation.</param>
public DateTimeNullableSerializer(BsonType representation)
{
ValueType = typeof(DateTime?);
dateTimeSerializer = new DateTimeSerializer(DateTimeKind.Utc, representation);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:DateTimeNullableSerializer" /> class.
/// </summary>
/// <param name="kind">The kind.</param>
public DateTimeNullableSerializer(DateTimeKind kind)
{
ValueType = typeof(DateTime?);
dateTimeSerializer = new DateTimeSerializer(kind, BsonType.DateTime);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:DateTimeNullableSerializer" /> class.
/// </summary>
/// <param name="kind">The kind.</param>
/// <param name="representation">The representation.</param>
public DateTimeNullableSerializer(DateTimeKind kind, BsonType representation)
{
ValueType = typeof(DateTime?);
dateTimeSerializer = new DateTimeSerializer(kind, representation);
}
public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
if (context.Reader.CurrentBsonType == BsonType.Null)
{
context.Reader.ReadNull();
return null;
}
return dateTimeSerializer.Deserialize(context, args);
}
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
{
if (value is null)
context.Writer.WriteNull();
else
dateTimeSerializer.Serialize(context, args, (DateTime)value);
}
}
- 2 回答
- 0 关注
- 239 浏览
添加回答
举报