2017-05-18 1 views
0

빠른 멍청한 놈 질문, 나는 위해 throw되는 예외를 다시 역 직렬화 할 때C# DataTable의 바이너리 직렬화는 정말 날 귀찮게한다

직렬화

'입력 스트림이 유효한 바이너리 포맷하지 않습니다'그러나 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

Lu Henry 주석에 따르면 실제로 테이블을 데이터 세트로 이동시킨 다음 쓰기 만하면됩니다.

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