【问题标题】:Serialize/Deserialize two-dimensional array序列化/反序列化二维数组
【发布时间】:2013-04-30 03:15:12
【问题描述】:

由于某种原因,我之前的问题被认为过于含糊。所以让我更具体一点。

我有一个单一类型的二维数组。 我想将其序列化以保存在 Access 数据库中。

建议将其保存为备注字段,这很好。 我想稍后阅读备忘录字段并将其反序列化以检索原始数组。 我在网上和这里进行了广泛搜索,但找不到答案。我相信我正在正确序列化数组,但不知道如何反序列化它。

此代码似乎可用于序列化,但我不知道如何反序列化:

Dim f As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter  
Dim ms As New MemoryStream  
f.Serialize(ms, arLHS)  
Dim byArr As Byte() = ms.ToArray

然后我将 byArr 保存到备注字段。

请提供示例代码。

【问题讨论】:

  • 你之前的问题确实比较模糊。 SO上的人往往会因缺乏细节而皱眉。这个问题的措辞很好。 +1

标签: vb.net winforms visual-studio-2008 serialization


【解决方案1】:

您可以通过 base64 转换器对其进行反序列化:

Dim str_b64 As String = Convert.ToBase64String(byArr)
Dim ms2 As New MemoryStream(Convert.FromBase64String(str_b64))
Dim intArr2(,) As Int32 = f.Deserialize(ms2)

这可能看起来有些尴尬,但它确实有效 - 在 VS 2010 的控制台应用程序中进行了测试。

信用归here。通过这个链接,你还可以找到完整版的代码来玩。

【讨论】:

  • 我尝试了以下代码,但出现错误无法将 System.String 类型的对象转换为 System.Byte[] 在以下代码中执行 Convert.ToBase64String 时会发生这种情况: Dim f As New System .Runtime.Serialization.Formatters.Binary.BinaryFormatter Dim ms As New MemoryStream f.Serialize(ms, arLHS) Dim byArr As Byte() = ms.ToArray
  • 对不起,我粘贴了错误的代码。这是正确的代码(并且 .Item("LHS") 在 Access 中保存为备注字段): Dim theArrayAsString As String = Convert.ToBase64String(dtLHS.Rows(0).Item("LHS")) Dim ms2 As New MemoryStream (Convert.FromBase64String(theArrayAsString)) Dim newLHS(,) As Single = f.Deserialize(ms2)
  • @JohnLee:不幸的是,您不能在 cmets 中格式化代码。因此,请更新您的原始问题。您是否尝试过我提到的链接中的完整代码版本?在序列化值时,这与您的版本之间可能存在差异,因为您必须使用匹配的序列化/反序列化方法。
  • 感谢您的回复。我之前在搜索解决方案时确实看到了该链接。你的是正确的,但我认为问题在于将序列化数据保存为备忘录,这是一个无法转换为字节数组的字符串。当我在 Access 中将字段类型更改为 OLEObject 时,它似乎可以工作。感谢您的时间和帮助!
  • @JohnLee:感谢您的更新,很高兴您能正常使用。不要忘记接受和/或支持我的回答。
【解决方案2】:

我将 Access 字段的数据类型从备注更改为 OLE 对象,这似乎有效。当我查看 Access 中的数据时,它告诉我该字段是“长二进制数据”,并且在从 Access 读取记录后,我能够使用以下代码:

Dim f As New System.Runtime.Serialization.Formatters.BinaryFormatter
Dim byArr As Byte()
byArr = DirectCast(dtLHS.Rows(0).Item("LHS"), Byte())
Dim theArrayAsString As String = Convert.ToBase64String(byArr)
Dim ms2 As New MemoryStream(Convert.FromBase64String(theArrayAsString))
Dim newLHS(,) as single = f.Deserialize(ms2)

这是正确的吗?

【讨论】:

  • 在 StackOverflow 上,在答案中提问并不常见。我知道这与问题直接相关,但请注意为此创建另一个问题。您也更有可能通过这种方式获得答案。
  • 您好 Neolisk,感谢您对如何成为 Stackoverflow 的优秀成员的意见。我确实想遵循正确的礼仪。我问了一个新问题,因为我看不到如何格式化包含代码的评论回复。你能指点我如何做到这一点的说明吗?
  • 您最初的问题是如何Serialize/Deserialize two-dimensional array,我试图在我的回答中涵盖。它的数据库方面与您的情况相关,但通常是一个不同的问题。使用每个页面右上角的 功能,并在其他问题中具体说明您的数据库类型问题。从您上面的帖子中,我不清楚Is this correct? 指的是什么,所以请在您的新问题中详细说明。谢谢!
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2022-11-30
  • 2016-01-28
  • 2015-10-17
  • 2016-09-15
相关资源
最近更新 更多