【问题标题】:End of Stream encountered before parsing was completed. SerializationException在解析完成之前遇到流结束。序列化异常
【发布时间】:2014-01-22 01:32:07
【问题描述】:

任何人都可以帮助这个方法?我有一个将文件反序列化为类型的通用方法。

public static T DeserializeFromFile<T>(string fileName) where T : class
{
    if (!File.Exists(fileName))
        return null;

    try
    {
        using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            stream.Seek(0, SeekOrigin.Begin);

            return (T)formatter.Deserialize(stream);
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}

知道为什么我会得到这个 SerializationException 吗?

谢谢。

【问题讨论】:

  • 可能是因为文件写入不正确......您也不需要将流寻找到 0 - 当您打开它时它已经存在了。
  • 是序列化的问题,类型是外部组装类型,没有Seri​​alizable属性。
  • @George:那你是怎么序列化的;因为这个异常是在反序列化过程中抛出的,所以我之前假设对象已经序列化成功了..

标签: serialization c#-4.0 generics binaryformatter


【解决方案1】:

尝试删除stream.Seek(0, SeekOrigin.Begin);,但是无论如何您如何序列化数据,也许那里也有问题?适当的方法如下所示:

public static bool TrySerializeToFile<T>(string fileName, T data) where T : class
{
    bool operationSucceed = false;
    try
    {
        using (FileStream stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
        {
            BinaryFormatter formatter = new BinaryFormatter();

            formatter.Serialize(stream, data);

            operationSucceed = true;
        }
    }
    catch
    { }

    return operationSucceed;
}

【讨论】:

    【解决方案2】:

    您是否尝试过使用 Stream.Position 属性?换句话说,而不是这个声明:

    stream.Seek(0, SeekOrigin.Begin);
    

    那句话:

    stream.Position=0;
    

    【讨论】:

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