2017-05-18 2 views
0

Schnell Noob Frage, die wirklich stört mich, Ich bin auf der Serialisierung jedoch ein Datatable-Array, wenn Deserialisieren es eine Ausnahme zurück geworfen wird für ‚Der Eingangsstrom ist kein gültiges binäres Format‘C# Datatable Binary Serialisierung

Serialisierung

public static bool saveToFile(DataTable[] NW, string path) 
    { 

     try 
     { 
      using (var stream = new MemoryStream()) 
      { 
       IFormatter formatter = new BinaryFormatter(); 
       formatter.Serialize(stream,NW); 
       stream.Close(); 
       File.WriteAllBytes(path,stream.ToArray()); 
      } 
      return true; 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show("ERROR" + Environment.NewLine + ex.Message); 
      return false; 
     } 
    } 

Deserialisierung

public static DataTable[] loadFromFile(string path) 
    { 
     try 
     { 
      byte[] buffer = File.ReadAllBytes(path); 
      var stream = new MemoryStream(buffer); 
      IFormatter formatter = new BinaryFormatter(); 
      return (DataTable[])formatter.Deserialize(stream); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show("ERROR" + Environment.NewLine + ex.Message); 
      return null; 
     } 
    } 

ich habe versucht, es auch ohne Memorystream und stattdessen die Datei-Stream zurück von File.Open (str verwendet ing Weg, FileMode.Create/Open)

Auch kurz bevor es in die Datei schreiben, ist dies das Aussehen der Byte-Array:

M

Wenn es

Lesen: e

Es sieht aus wie es nicht wirklich alles in die Datei geschrieben hat?

Danke!

+0

Ist es unbedingt notwendig, es im Binärformat zu speichern? Wenn nicht, verfügt DataSet über Funktionen zum Schreiben aller darin enthaltenen DataTables. in eine XML-Datei und in ähnlicher Weise können Sie aus der gespeicherten XML-Datei lesen. –

+0

Es ist nicht obligatorisch, binär zu sein, versuchte es mit binär, so dass ich RemotingFormat für jede Tabelle auf binär setzen kann, so spart es etwas Speicherplatz, da importierte Daten ziemlich groß sind –

+0

Ich habe gerade Ihre Methoden in einen Komponententest geworfen mit generierten Daten. Ihr Code scheint gut zu funktionieren. Haben Sie Beispieldaten für Ihr Problem? Haben Sie die Dateigröße auf die gespeicherte physische Datei überprüft? –

Antwort

0

Nach Lu Henry Kommentar, Es funktioniert tatsächlich durch Verschieben der Tabellen zu einem Dataset und dann schreiben Sie es.

public static bool saveToFile(DataTable[] NW, string path) 
    { 

     try 
     { 
      var NWDS = new DataSet(); 
      foreach (DataTable dt in NW) { 
       NWDS.Tables.Add(dt.Copy()); 
      } 
      NWDS.WriteXml(File.Create(path)); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show("ERROR" + Environment.NewLine + ex.Message); 
      return false; 
     } 
    } 


    public static DataTable[] loadFromFile(string path) 
    { 
     try 
     { 
      var NWDS = new DataSet(); 
      NWDS.ReadXml(File.Open(path,FileMode.Open)); 
      var NW = new DataTable[15]; 
      NWDS.Tables.CopyTo(NW,0); 
      return NW; 

     } 
     catch(Exception ex) 
     { 
      MessageBox.Show("ERROR" + Environment.NewLine + ex.Message); 
      return null; 
     } 
    }