End of Stream encountered before parsing was completed?

后端 未结 6 626
遇见更好的自我
遇见更好的自我 2020-11-30 09:25

I am trying to deserialize a stream but I always get this error \"End of Stream encountered before parsing was completed\"?

Here is the code:

                


        
相关标签:
6条回答
  • 2020-11-30 10:08

    I have spent 5 hourse and have got end of stream error and lost data (Not obvious feature in GzipStream: you should use underlying stream only after flush GzipStream).

    Full example of working code:

    using System;
    using System.IO;
    using System.IO.Compression;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace ConsoleApp3
    {
        class Program
        {
            static void Main(string[] args)
            {
                string large = LargeJsonContent.GetBigObject();
                string base64;
    
                using (var readStream = new MemoryStream())
                using (var writeStream = new MemoryStream())
                {
                    using (GZipStream compressor = new GZipStream(writeStream, CompressionMode.Compress, true)) //pay attention to leaveOpen = true
                    {
                        var formatter = new BinaryFormatter();
                        formatter.Serialize(readStream, large);
    
                        Console.WriteLine($"After binary serialization of JsonString: {readStream.Length} bytes");
    
                        readStream.Position = 0;
                        readStream.CopyTo(compressor);
                    }
    
                    Console.WriteLine($"Compressed stream size: {writeStream.Length} bytes");
    
                    writeStream.Position = 0;
                    byte[] writeBytes = writeStream.ToArray();
                    base64 = Convert.ToBase64String(writeBytes);
                }
    
    
                ////
    
                using (var stream = new MemoryStream())
                {
                    var formatter = new BinaryFormatter();
                    formatter.Serialize(stream, base64);
                    Console.WriteLine($"Size of base64: {stream.Length} bytes");
                }
    
                Console.WriteLine("---------------------");
                ////
    
                string large2;
    
                var bytes = Convert.FromBase64String(base64);
                using (var readStream = new MemoryStream())
                {
                    readStream.Write(bytes, 0, bytes.Length);
                    readStream.Position = 0;
                    Console.WriteLine($"Compressed stream size: {readStream.Length} bytes");
                    using (var writeStream = new MemoryStream())
                    {
                        using (GZipStream decompressor = new GZipStream(readStream, CompressionMode.Decompress, true)) //pay attention to leaveOpen = true
                        {
                            decompressor.CopyTo(writeStream);
                            writeStream.Position = 0;
                        }
    
                        var formatter = new BinaryFormatter();
                        large2 = (string)formatter.Deserialize(writeStream);
                    }
                }
    
                Console.WriteLine(large == large2);
                Console.WriteLine($"large:{large.Length} | large2:{large2.Length}");
            }
        }
    }
    
    
    0 讨论(0)
  • 2020-11-30 10:09

    Try to set the position to 0 of your stream and do not use your object but the object type.

            BinaryFormatter b = new BinaryFormatter();
            s.Position = 0;
            return (YourObjectType)b.Deserialize(s);
    
    0 讨论(0)
  • 2020-11-30 10:17

    Make sure the serialization completed, and that the serialization type matches the de-serialization type (i.e., make sure you're serializing with a BinaryFormatter if you're de-serializing with one). Also, make sure that the stream you serialized to really finished serializing, with a Stream.Flush() or something to that effect.

    0 讨论(0)
  • 2020-11-30 10:21

    In my case I used:

    stream.Seek(0, SeekOrigin.Begin);
    

    after i serialized the stream, and before i deserialized the stream works charm. hope this helps!

    0 讨论(0)
  • 2020-11-30 10:24

    Check in your sender code if you are not doing the following

    NetworkStream strm = client.GetStream(); // the stream
    formatter.Serialize(strm, status); // the serialization process
    strm.Close();// Remove this code, this was the culprit in my case
    
    0 讨论(0)
  • 2020-11-30 10:25

    I had the same exception thrown, until I added the [Serializable] tag to the class I was Serializing :)

    Then it all worked perfectly.

    0 讨论(0)
提交回复
热议问题