2017-05-18 323 views
0

快速noob問題,其真正困擾我,我序列化的DataTable陣列但反序列化它,當一個異常被拋出「的輸入流是不是一個有效的二進制格式」C#的DataTable二進制序列化

系列化

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; 
     } 
    } 

反序列化

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; 
     } 
    } 

我也嘗試過不MemoryStream的,而是使用File.Open返回文件流(STR荷蘭國際集團的路徑,FileMode.Create /開)

而且,只需將其寫入文件之前,這是字節數組的外觀:

M

當看完

e

它看起來好像沒有將所有內容都寫入文件?

謝謝!

+0

是否有必要以二進制格式保存它?如果不是,DataSet具有寫入其中所有DataTable的功能;到一個xml文件中,並且類似地,您可以從保存的xml文件中讀取。 –

+0

它不是強制性的二進制,試圖用二進制做它,所以我可以在每個表上設置RemotingFormat爲二進制,因此它節省一些空間,因爲導入的數據是相當大的 –

+0

我剛剛把你的方法引入單元測試與生成的數據。 你的代碼似乎工作正常。 你有問題的樣本數據嗎? 您是否檢查過保存的物理文件的文件大小差異? –

回答

0

繼盧亨利評論,它實際上是通過將表格移動到一個數據集,然後寫它。

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; 
     } 
    }