web-dev-qa-db-ja.com

解析が完了する前にストリームの終わりに遭遇しましたか?

ストリームを逆シリアル化しようとしていますが、「解析が完了する前にストリームの終わりが検出されました」というエラーが常に発生します。

これがコードです:

        //Some code here
        BinaryFormatter b = new BinaryFormatter();
        return (myObject)b.Deserialize(s);//s---> is a Stream object that has been fill up with data some line over here

アイデアはありますか?

44
Mister Dev

ストリームの位置を0に設定し、オブジェクトではなくオブジェクトタイプを使用してください。

        BinaryFormatter b = new BinaryFormatter();
        s.Position = 0;
        return (YourObjectType)b.Deserialize(s);
54

シリアル化が完了し、シリアル化の種類がシリアル化解除の種類と一致していることを確認してください(つまり、BinaryFormatterでシリアル化している場合は、BinaryFormatterでシリアル化していることを確認してください)。また、Stream.Flush()またはその効果を使用して、シリアライズしたストリームが本当にシリアライズを完了したことを確認してください。

6
GWLlosa

[Serializable]タグをSerializingしていたクラスに追加するまで、同じ例外がスローされました:)

その後、すべてが完璧に機能しました。

3
Ryano
s.Position = 0;

これは、アレイにデータのコピーを開始するには、最初に戻る必要があるためです。

1

同様のエラーが発生しました

シリアライズとデシリアライズの際に異なるデータ型を取得することでした。誤って、mariadbにデータを格納するときにMediumTextを使用し、データを取得するときにTextを使用したため、ストリームの一部しか取得できませんでした。

データ型が同じかどうかを確認してください。

0
lastboy

私の場合、私は使用しました:

stream.Seek(0, SeekOrigin.Begin);

ストリームをシリアル化した後、ストリームを非シリアル化する前に、ストリームは魅力的に機能します。お役に立てれば!

0

私は5時間を費やし、ストリームの終わりエラーとデータの損失がありました(GzipStreamの明らかな機能ではありません:基になるストリームは、GzipStreamをフラッシュした後にのみ使用してください)。

作業コードの完全な例:

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
Yaroslav