【问题标题】:In WebAPI 2 using Json.Net a SQL Server Timestamp serializes but does not deserialize在使用 Json.Net 的 WebAPI 2 中,SQL Server Timestamp 序列化但不反序列化
【发布时间】:2013-12-21 15:40:33
【问题描述】:

SQL Server 时间戳变成 POCO 对象中的 byte[]。对象被序列化,时间戳变成一个 base 64 字符串。

一个例子是'AAAAAAA2QDE='

当对象被回发到服务器时,在模型验证期间你会得到:

The value 'AAAAAAA2QDE=' is not valid for Byte.

我正在使用这个值来检查记录的状态,以与 SQL 中的当前记录进行比较,以查看自从该用户检索到它后是否有其他人更新了它(很正常)。

但字符串并没有反序列化回字节数组,它似乎试图将其放入单个字节中。

这应该是一个非常普遍的问题。有什么想法吗?

【问题讨论】:

  • 这是一个很好的例子,但我从 WebAPI 项目中获取和返回数据,与使用数据的客户端无关。在这种情况下,它是一个基于 knockoutjs 的 Web 应用程序,但它可能是一个 iPhone 应用程序。我需要的是一个如何让 Json.net 将字节数组反序列化回其原始形式的示例。

标签: c# asp.net-web-api timestamp json.net


【解决方案1】:

我们可以将 SQL 列(通过像 NHibernate 之类的 ORM...)或直接使用 ADO.NET 映射到 byte[] 类型的属性,但要将此属性设置为受保护/在服务器内部。相反,我们可以让另一个 string 属性根据需要进行转换:

protected virtual byte[] Timestamp { get; set; }
public virtual string Version
{
    get { return Timestamp.IsEmpty() ? null : Convert.ToBase64String(Timestamp); }
    set { Timestamp = value.IsEmpty() ? null : Convert.FromBase64String(value); }
}

Timestamp 用于内部处理,代表真正的字节,Version 用于客户端......很好地反序列化。

NHibernate 的示例here

【讨论】:

  • 我正在使用 POCO 对象和实体框架。我想让 JSON.net 正确反序列化它,谢谢你的建议。
  • 不要误会我的意思。上述建议完全遵循 POCO。 (检查此stackoverflow.com/a/13632872/1679310)。关键是,该字符串几乎可以被任何工具(xml、url ...)序列化或使用。外部世界 - 将其发布为 base64。不依赖 de/serializers ...格式化程序...而只是一个建议(为我工作了很多年;)
猜你喜欢
  • 2020-06-08
  • 2012-05-20
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多