Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 输入流不是有效的二进制格式。_Database_Vb.net_Ms Access_Serialization_Deserialization - Fatal编程技术网

Database 输入流不是有效的二进制格式。

Database 输入流不是有效的二进制格式。,database,vb.net,ms-access,serialization,deserialization,Database,Vb.net,Ms Access,Serialization,Deserialization,在下文中,我将类对象“ListViewScore”序列化为内存流,然后将内存流的缓冲区存储到access数据库列中 If chkSerialize.Checked = True Then Dim cereal As New ListViewCereal 'class used to store item list views Dim bin_form As New BinaryF

在下文中,我将类对象“ListViewScore”序列化为内存流,然后将内存流的缓冲区存储到access数据库列中

    If chkSerialize.Checked = True Then
        Dim cereal As New ListViewCereal                                        'class used to store item list views
        Dim bin_form As New BinaryFormatter                                     'used to serialize and deserialize objects
        Dim file_stream As New MemoryStream                                     'serialization stream
        Dim report_row As DataRow = mycallerPreview.previewInst.SerializedDataDataSet.SavedReportLayouts.NewRow

        cereal.prep_cereal(MoveItemListViewClass1, MoveItemListViewClass2, MoveItemListViewClass3)
        bin_form.Serialize(file_stream, cereal)
        builder.Clear()

        'extract buffer and append string representation of each bit to StringBuilder "builder"
        file_stream.Position = 0
        Dim byteArray() As Byte = file_stream.GetBuffer()
        For Each bit As Byte In byteArray
            builder.Append(bit.ToString)
        Next

        report_row("Serialized Data") = builder.ToString 'column storing string rep. of buffer

        builder.Clear()
        builder.Append(txtYear.Text.ToString).Append("-").Append(txtVendor.Text.ToString).Append("-").Append(txtReport.Text.ToString)
        report_row("Report Name") = builder.ToString
        report_row("User Name") = ""                        'TODO:setup login window to track users
        mycallerPreview.previewInst.SerializedDataDataSet.SavedReportLayouts.AddSavedReportLayoutsRow(report_row)
        mycallerPreview.previewInst.TableAdapterManager.UpdateAll(mycallerPreview.previewInst.SerializedDataDataSet)

        file_stream.Close()
        file_stream.Dispose()
        mycallerPreview.Show()
        mycallerPreview.previewInst.Close()
        mycallerPreview.previewInst = Nothing
    Else
        mycallerPreview.Show()
        mycallerPreview.previewInst.Close()
        mycallerPreview.previewInst = Nothing
    End If
在下面的代码中,我尝试通过引用数据库行/列来反序列化该类

       If cmbSavedLayouts.SelectedIndex <> -1 Then

        Dim rep_row As DataRow = mycallerSelect2.select_secInst.SerializedDataDataSet.SavedReportLayouts.NewRow
        rep_row = mycallerSelect2.select_secInst.SerializedDataDataSet.SavedReportLayouts.Rows(cmbSavedLayouts.SelectedIndex)
        Dim str As String = rep_row("Serialized Data").ToString
        Dim temp As Byte() = str.Select(AddressOf Byte.Parse).ToArray
        Dim file_stream As New MemoryStream

        file_stream.Write(temp, 0, temp.Count)
        file_stream.Position = 0
        Dim cereal_views As ListViewCereal = CType(bin_form.Deserialize(file_stream), ListViewCereal)
    End If
如果cmbSavedLayouts.SelectedIndex-1,则
Dim rep_行作为DataRow=MyCallerSelect 2.select_secInst.SerializedDataSet.SavedReportLayouts.NewRow
rep_row=MyCallerSelect 2.选择_secInst.SerializedDataSet.SavedReportLayouts.Rows(cmbSavedLayouts.SelectedIndex)
Dim str As String=rep_行(“序列化数据”)。ToString
Dim temp As Byte()=str.Select(AddressOf Byte.Parse).ToArray
Dim文件\u流作为新内存流
文件流写入(临时、0、临时计数)
文件\u stream.Position=0
Dim GREATE_视图为ListViewScore=CType(bin_form.Deserialize(文件流),ListViewScore)
如果结束

当我尝试反序列化文件流时,收到未处理的异常“输入流不是有效的二进制格式”。我对这方面还不太熟悉,所以非常感谢您的帮助

您有几个错误。首先,这是:

Dim byteArray() As Byte = file_stream.GetBuffer()
缓冲区总是大于存储的数据;有时更大(70-80%!),因此应使用
ToArray()
仅获取数据。接下来是:

For Each bit As Byte In byteArray
    builder.Append(bit.ToString)
Next
我不知道什么是
builder
,但它看起来像
StringBuilder
。保存
byteArray
本身并避免任何其他转换是最简单的。但是,对于字符串存储,应使用Base64字符串,该字符串可以轻松转换回字节数组:

Dim serData As String = Convert.ToBase64String(memStrm.ToArray())
因此,序列化和存储应该类似于:

Dim B64Data As String
Using ms As New MemoryStream
    Dim bf As New BinaryFormatter
    bf.Serialize(ms, cereal)
    B64Data = Convert.ToBase64String(ms.ToArray())
End Using

' no idea what this is, just copied it
report_row("Serialized Data") = B64Data 
反序列化则相反:

' get data, unbox
Dim B64Data = dr.Field(Of String)("Serialized Data")

' I have no idea if these types are correct, just copying them
Dim cereal_views As ListViewCereal
Using ms As New MemoryStream(Convert.FromBase64String(B64Data ))
    Dim bf As New BinaryFormatter
    cereal_views = CType(bf.Deserialize(ms), ListViewCereal)
End Using

正如我所料。。。我使事情变得比需要的更困难。谢谢你的快速回答,这很有魅力!我也为没有进一步澄清属性而道歉!我们都是这样做的——很多事情在当时看起来像是好主意,回想起来似乎太聪明了一半。