从二进制文件中反序列化对象

时间:2016-04-26 17:17:41

标签: list object binary deserialization

我正在使用方法将对象序列化和反序列化为二进制文件,我已经在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; 
            }
        }

1 个答案:

答案 0 :(得分:0)

我在Stackoverflow上阅读Fateme Shirmohammadi上的帖子后解决了这个问题。

解决方案是检查流中的哪个位置&#34;阅读器&#34;并且循环直到它到达流的结束或长度。在每次迭代中,您将范围附加到列表中。请参阅附加的已更改的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; 
        }

我应该赞扬那些回答Fateme问题的ladenedgeMarc Gravell。 Stackoverflow依赖于很好的资源。

Thor P