【问题标题】:formatter deserialize gives: End of Stream encountered before parsing was completed格式化程序反序列化给出:在解析完成之前遇到流结束
【发布时间】:2013-04-02 13:43:58
【问题描述】:

我正在尝试反序列化保存到文件中的对象(使用二进制格式化程序)。无论我尝试什么,我都会遇到异常:在解析完成之前遇到流结束

我有以下几行代码:

public static T DeserializeFromBinaryFile<T>(string fileName)
{
    T instance = default(T);
    FileStream fs = new FileStream(fileName, FileMode.Open);
    try
    {
        BinaryFormatter formatter = new BinaryFormatter();
        instance = (T)formatter.Deserialize(fs);
    }
    catch{}
    finally
    {
        fs.Close();
    }

    return instance;
}

我也试过了:

public static T DeserializeFromBinaryFile<T>(string fileName)
{
    T instance = default(T);
    FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    MemoryStream ms = new MemoryStream();
    try
    {
        byte[] bytes = new byte[fs.Length];
        fs.Read(bytes, 0, (int)fs.Length);
        ms.Write(bytes, 0, (int)fs.Length);
        ms.Position = 0;
        ms.Seek(0, SeekOrigin.Begin); 
    }
    catch { }

    try
    {
        BinaryFormatter formatter = new BinaryFormatter();
        instance = (T)formatter.Deserialize(ms);
    }
    catch { }
    finally
    {
        ms.Close();
        fs.Close();
    }

    return instance;
}

但无论我做什么,总是会遇到异常:

在解析完成之前遇到流结束

添加: 我只是做了一些额外的测试。如果我有一个简单的对象,只有几个属性,它就可以正常工作。使用更(大)复杂的对象,封装其他对象、枚举等,这就是我得到异常的时候。

【问题讨论】:

    标签: c# exception binary formatter


    【解决方案1】:

    尝试在第二个 try/catch 块内将 position 设置为 0:

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

    【讨论】:

      【解决方案2】:

      您是否尝试过反序列化文件流而不是内存流? 它对我有用。

      FileStream fs = new FileStream(fileName, FileMode.Open);
      fs.position=0;
      instance = (T)formatter.Deserialize(fs);
      

      问候

      【讨论】:

        【解决方案3】:

        要序列化的类中的每个成员都必须具有[Serializable()] 属性或标记为[NonSerialized]。请注意,枚举和所有简单的内置类型已经可以序列化,不需要[Serializable()] 属性。

        下面的例子给出了同样的错误。把public class B上面的[Serializable()]去掉注释,反序列化就不会出错了。

        *无法肯定地说这是否是您的错误的原因,因为您没有提供导致错误的类的示例。

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        using System.IO;
        using System.Runtime.Serialization;
        using System.Runtime.Serialization.Formatters.Binary; 
        
        //[Serializable()]
        public class B
        {
            public int y = 2;
        }
        [Serializable()]
        public class A
        {
            public int x = 2;
            /*[NonSerialized]*/ public B b;
            public static T DeserializeFromBinaryFile<T>(string fileName)
            {
                T instance = default(T);
                FileStream fs = new FileStream(fileName, FileMode.Open);
                try
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    instance = (T)formatter.Deserialize(fs);
                }
                catch (System.Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    fs.Close();
                }
        
                return instance;
            }
            public static void SerializeBinaryFile<T>(string fileName,T t)
            {
                try
                {
                    using (FileStream fs = File.Open(fileName, FileMode.Create))
                    {
                        BinaryFormatter bf = new BinaryFormatter();
                        bf.Serialize(fs, t);
                    }
                }
                catch (System.Exception ex)
                {
        
                }
            }
        }
        
        class Program
        {
            static void Main(string[] args)
            {
                A testA = new A();
                A.SerializeBinaryFile("test.dat", testA);
                A testReadA = A.DeserializeFromBinaryFile<A>("test.dat");
            }
        }
        

        https://msdn.microsoft.com/en-us/library/ms973893.aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多