从MongoDB获取数据时会出现此错误消息.格式为yyyy-MM-dd HH:mm:ss.

public class UserFile
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    [BsonElement("_id")]
    public string? Id { get; set; }

    [BsonElement("upload_time")]
    [BsonDateTimeOptions(Kind = DateTimeKind.Unspecified, Representation = BsonType.String)]
    public DateTime UploadTime { get; set; }

    [BsonElement("data")]
    public BsonDocument? Data{ get; set; }
}

如何正确反序列化日期时间字符串?我无法在插入时更改该值,因为该值来自另一个应用程序.

推荐答案

您可以创建自定义序列化程序,将string反序列化为DateTime.在最简单的形式中,如果您只想反序列化,则以下示例显示了一个读取值的自定义序列化程序:

public class CustomDateTimeSerializer : IBsonSerializer
{
  public Type ValueType => typeof(DateTime);

  public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
  {
    var str = context.Reader.ReadString();
    return DateTime.ParseExact(str, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
  }

  public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
  {
    throw new NotImplementedException();
  }
}

您可以将属性配置为使用序列化程序,如下所示:

[BsonElement("upload_time")]
[BsonSerializer(typeof(CustomDateTimeSerializer))]
public DateTime UploadTime { get; set; }

请注意,在示例中,删除了DateTimeOptions属性,因为简单序列化程序不支持DateTimeOptions的配置.

Csharp相关问答推荐

在实际上是List T的 IESEARCH上多次调用First()是否不好?

为什么EF Core 6会针对null验证Count(*)?

SignalR客户端不会打印队列位置'

返回TyedResults.BadRequest<;字符串>;时问题详细信息不起作用

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

Unix上的.NET(核心):.NET意外地未看到通过P/Invoke系统调用对环境变量进行的进程内修改

C# CompareTo()和Compare()可以返回除-1和1以外的整数吗?

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

如何比较C#中的L和ł(波兰字符)返回TRUE

在C#中过滤Excel文件

如何防止Visual Studio断点以红色突出显示到整行?

用于获取字符串的最后12个字符的正则表达式(空格除外)

使用未赋值的、传递的局部变量

C#使用相同内存的多个数组

如何从SignalR获取连接客户端的域

WPF如何获取有关从一个视图模型更改另一个视图模型的信息

使用DI实例化带有动态参数的服务?

无法停止PowerShell中的低级挂钩(c#挂钩)

MS Project读取项目自定义域

从列表中跳过和获取条目的优雅方式