【问题标题】:How do you deserialze a varbinary in c#?你如何反序列化 c# 中的 varbinary?
【发布时间】:2016-11-17 18:41:46
【问题描述】:

我按照this guide 将我的会话数据存储在一个 sql server 表中。

如何反序列化存储的值? sql 数据类型是 varbinary。

我已经尝试过了,但我在反序列化行收到此错误:“输入流不是有效的二进制格式”

BinaryFormatter formatter = new BinaryFormatter();

byte[] byteVal = _context.Sessions.First().Value;
System.IO.Stream stream = new System.IO.MemoryStream(byteVal);
var des = formatter.Deserialize(stream);

【问题讨论】:

  • 如果您将对象存储为varbinary,为什么还要尝试序列化它?您应该能够使用byte[] 直接在 SQL 中存储和检索它
  • 我不想序列化任何东西。我想反序列化 varbinary 值。 @CamBruce
  • 对不起,我看错了。除非你没有在你的 sn-p 中包含它,否则你不应该直接序列化 byteValSessions.First() 吗?
  • 抱歉,有点糊涂。我会将它序列化为什么?不是已经序列化了吗? @CamBruce
  • Session对象不应该自动为你处理序列化和反序列化吗?

标签: c# asp.net serialization asp.net-core asp.net-core-mvc


【解决方案1】:

以下代码检索您的值并将其放置在一个名为 byteVal 的字节数组中:

byte[] byteVal = _context.Sessions.First().Value;

我个人更喜欢将这样的字节数组命名为 bytes 而不是 byteVal,只是为了更清楚地表明它是多字节长。

byte[] bytes = _context.Sessions.First().Value;

无论如何,此时您可以将bytes 与任何接受字节数组的方法一起使用。 (如会话存储)

所以不需要序列化或序列化。

【讨论】:

  • 谢谢。如果我做 string x = System.Text.Encoding.ASCII.GetString(bytes);我可以看到一些可读数据(\u0002\0\0\u0002?6'?#+?????\nm?\u007f?\0\u0006random\0\0\0\u0003abc)知道为什么吗? @RonC​​pan>
  • 当然,在这种情况下,您要求将字节数组解释为 ascii 字符串,因此您会看到如果它是 ascii 字符串会是什么样子。但它不是一个 ascii 字符串,所以最好不要这样做。如果您想将其视为字符串,最好使用 Convert.ToBase64String(bytes);假设所有字节数组都可以有效地转换为 base64 字符串。这被称为“base 64 编码字节数组”。在这种情况下,您可以通过执行此 byte[] bytes = Convert.FromBase64String(base64String); 从 base64 字符串到字节的相反方式
  • 抱歉回复晚了。不幸的是,当我执行 Covnert.ToBase64String(bytes) 时,更加胡言乱语。
  • 当然,它看起来像乱码,但这是将字节数组编码为字符串的一种行业标准方法。而且是可逆的。或者,如果您想将字节视为十六进制,则有很多不同的方法可以做到这一点。最简单的可能是 string hexString = BitConverter.ToString(bytes).Replace("-","");
  • @johnluke.laue 如果解决了您的问题,请记得接受我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多