2016-04-26 11 views
0

Ich verwende Methoden zum Serialisieren und Deserialisieren von Objekten in Binärdateien, die ich hier im Stackoverflow beschrieben und beschrieben habe. unter anderem im folgenden Link: https://stackoverflow.com/questions/21080839/pulling-objects-from-binary-file-and-putting-in-listt Die Serialisierung funktioniert einwandfrei, ich sehe die Datei wächst, wenn Objekte an sie angehängt werden und beim Lesen mit Deserialisierung ist das Problem, dass ich nur den Teil der Liste, die in der ersten Schreibphase geschrieben wurde, bekomme Datei. Die abgerufenen Daten scheinen korrekt zu sein, aber ich kann nicht über die erste Anzahl von Objekten hinauslesen, die in der Liste in der ersten "Schreib" -Operation waren. Es ist, als ob die Dateiposition immer auf Null gesetzt ist.De-serialisieren von Objekten aus einer Binärdatei

Kann die Leseoperation in irgendeiner Weise geloopt oder gesteuert werden, um sie zum Lesen der gesamten Datei zu zwingen?

Schätzen Sie Ihre Kommentare zu diesem

Thor

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

Sie sollten wahrscheinlich Ihren eigenen aktuellen Code in die Frage einfügen – infixed

Antwort

0

ich das Problem gelöst, nachdem ein Beitrag von Fateme Shirmohammadi auf Stackoverflow zu lesen.

Die Lösung ist zu überprüfen, wo im Strom der "Leser" ist und Schleife, bis es das Ende oder die Länge des Stroms erreicht. In jeder Iteration fügen Sie den Bereich an die Liste an. Siehe die geänderte read() -Methode;

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

Ich soll Kredit zu ladenedge und Marc Gravell geben, die zu Fateme der Fragen beantwortet. Stackoverflow ist eine große Ressource.

Thor P

Verwandte Themen