2016-05-12 9 views
1

im folgenden bin ich Serialisierung des Klassenobjekts "ListViewCereal" in einen Speicher-Stream und dann Speichern des Speicher-Stream-Puffer in eine Access-Datenbank-Spalte.Eingabestrom ist kein gültiges Binärformat.

Im folgenden Code versuche ich, die Klasse zu deserialisieren, indem ich auf die Datenbankzeile/-spalte verweise.

 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 

Ich erhalte die nicht behandelte Ausnahme „Input Stream kein gültiges binäres Format ist“, wenn ich versuche file_stream deserialisieren. Ich bin ziemlich neu, also wird jede Hilfe geschätzt!

Antwort

1

Sie haben mehrere Fehler. Zuerst gibt es das:

Der Puffer ist immer größer als die gespeicherten Daten; manchmal viel größer (um 70-80%!), so dass man ToArray() verwenden sollte, um nur die Daten zu erhalten. dies ist Next:

For Each bit As Byte In byteArray 
    builder.Append(bit.ToString) 
Next 

Ich habe keine Ahnung, was builder ist, aber es sieht aus wie ein StringBuilder. Es wäre am einfachsten, die byteArray selbst zu speichern und andere Konvertierungen zu vermeiden. obwohl für String-Speicherung, sollten Sie eine Base64 Zeichenfolge verwenden, die leicht wieder in einem Byte-Array umgewandelt werden können:

Dim serData As String = Convert.ToBase64String(memStrm.ToArray()) 

Also, Serialisierung und Speicherung soll so etwas wie:

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 

Deserialisieren seien die umgekehrt:

' 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 
+0

Wie ich erwartet hatte ... machte ich die Dinge schwieriger als nötig. Danke für die schnelle Antwort das hat wie ein Zauber funktioniert! Ich entschuldige mich auch dafür, Attribute nicht mehr zu klären! –

+0

Wir alle machen das - viele Dinge, die zu der Zeit wie gute Ideen erscheinen, scheinen im Nachhinein zu schlau zu sein. – Plutonix

Verwandte Themen