序列化/反序列化二维数组

7
由于某些原因,我的上一个问题被认为过于模糊。所以我会更明确一些。
我有一个类型为single的二维数组。 我想将其序列化以保存在Access数据库中。
建议是将其保存为Memo字段,这很好。 我希望能够稍后读取Memo字段并对其进行反序列化以检索原始数组。 我已经在网上和这里广泛搜索,但找不到答案。我相信我正在正确地序列化该数组,但不知道如何反序列化它。
以下代码似乎可用于序列化,但我无法弄清楚如何进行反序列化:
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保存到Memo字段。

请提供样例代码。


你之前的问题确实相当模糊。SO上的人们往往对缺乏细节感到不满。这个问题表述得很好。+1 - Victor Zakharov
2个回答

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的控制台应用程序中进行了测试。

功劳归于这里。通过此链接,您还可以找到完整版本的代码以进行操作。


我尝试了以下代码,但出现错误“无法将类型为System.String的对象转换为类型System.Byte[]”。这是在以下代码中执行Convert.ToBase64String时发生的:Dim f As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatterDim ms As New MemoryStream f.Serialize(ms, arLHS)Dim byArr As Byte() = ms.ToArray - John Lee
抱歉,我粘贴了错误的代码。这是正确的代码(.Item("LHS") 在 Access 中保存为 Memo 字段):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) - John Lee
@JohnLee:很遗憾,在评论中无法格式化代码。请更新您的原始问题。您是否尝试了我提到的链接中的完整代码版本?可能存在在序列化值方面与您的版本不匹配的差异,因为您必须使用匹配的序列化/反序列化方法。 - Victor Zakharov
谢谢您的回复。我之前在寻找解决方案时确实看到了那个链接。您的答案是正确的,但我认为问题出在将序列化数据保存为Memo类型,这是一个无法转换为字节数组的字符串。当我在Access中将字段类型更改为OLEObject时,它似乎可以工作了。感谢您的时间和帮助! - John Lee

0

我将Access字段的数据类型从Memo更改为OLE Object,这似乎起作用了。当我查看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上,在答案中提问问题是不常见的。我知道这与问题直接相关,但请注意为此创建另一个问题。这样做也更有可能得到答案。 - Victor Zakharov
嗨,Neolisk,感谢您对如何成为Stackoverflow良好成员的建议。我确实想遵循正确的礼仪。我提出了一个新问题,因为我不知道如何格式化包含代码的评论回复。您能指导我如何操作吗? - John Lee
你的初始问题是如何序列化/反序列化二维数组,我在我的回答中尝试进行了覆盖。在数据库方面,它与你的情况有关,但通常是一个不同的问题。使用每个页面右上角的提问功能,在另一个问题中详细说明你在数据库类型方面遇到的问题。从你上面的帖子中,我不清楚“这是否正确?”指的是什么,所以请在新问题中详细说明。谢谢! - Victor Zakharov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接