2016-04-26 62 views
0

我正在使用方法序列化和反序列化對象到二進制文件,我已經發現這裏在stackoverflow上描述和討論。其中包括以下鏈接:https://stackoverflow.com/questions/21080839/pulling-objects-from-binary-file-and-putting-in-listt序列化過程工作正常,當對象被追加到它上面時,我看到該文件正在增長,並且在使用反序列化讀取時,問題是我只得到第一次寫入時寫入的列表部分文件。檢索到的數據看起來是正確的,但是我不會讀取超出第一個「寫入」操作中列表中第一個數量的對象。這就像文件位置始終設置爲零。從二進制文件反序列化對象

是否可以以任何方式循環或控制讀取操作來強制讀取整個文件?

感謝您的意見對這個

雷神

class singleBlob 
    { 
     public Bitmap bmpIndividualFish; 
     public Int64 idNumber; 
     public float area; 
     public float areaRatio; 
    } 

    class writeToFile 
    { 

     public void write(List<singleBlob> listOfBlobs) 
     { 
      string dir = @"D:\temp"; 
      string serFileName = Path.Combine(dir, "fIndividualFish.bin"); 

      //serialize 
      using (Stream streamw = File.Open(serFileName, FileMode.Append)) 
      { 
       var bformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 

       bformatter.Serialize(streamw, listOfBlobs); 
       //streamw.Close(); 
      } 

     } 

     public List<singleBlob> read() 
     { 
      string dir = @"D:\temp"; 
      string serFileName = Path.Combine(dir, "fIndividualFish.bin"); 

      //deserialize 
      using (Stream stream = File.Open(serFileName, FileMode.Open,FileAccess.Read)) 
      { 
       var bformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 

       List<singleBlob> listOfBlobs = (List<singleBlob>)bformatter.Deserialize(stream); 

       //stream.Close(); 
       return listOfBlobs; 
      } 
     } 
+0

你應該把你自己當前的代碼放在問題中 – infixed

回答

0

我解決了問題,從Fateme Shirmohammadi#2閱讀後門柱。

解決方案是檢查「閱讀器」在流中的位置並循環,直到達到流的結尾或長度。在每次迭代中,您都將範圍附加到列表中。查看附加的read()方法;

public List<singleBlob> read() 
    { 
     string dir = @"D:\temp"; 
     string serFileName = Path.Combine(dir, "fIndividualFish.bin"); 

     //deserialize 
     using (Stream stream = File.Open(serFileName, FileMode.Open,FileAccess.Read)) 
     { 
      var bformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 

      List<singleBlob> listOfBlobs = new List<singleBlob>(); 

      while (stream.Position != stream.Length) 
      { 
       listOfBlobs.AddRange((List<singleBlob>) bformatter.Deserialize(stream)); 
      } 
      // List<singleBlob> listOfBlobs = (List<singleBlob>)bformatter.Deserialize(stream); 

      //stream.Close(); 
      return listOfBlobs; 
     } 

我應該到ladenedgeMarc Gravell誰回答到Fateme的問題給予信貸。 Stackoverflow是一個很好的資源。

Thor P

相關問題