2016-04-26 4 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 на Stackoverflow.

Решение состоит в том, чтобы проверить, где в потоке находится «считыватель», и цикл, пока он не достигнет конца или длины потока. На каждой итерации вы добавляете диапазон в список. См. Измененный метод 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; 
     } 

я должен отдать ladenedge и Marc Gravell, который ответил на вопросы Fateme в. Stackoverflow - отличный ресурс.

Thor P

Смежные вопросы