【问题标题】:SerializationException: 'Attempting to deserialize an empty stream.' The file I am trying to deserialize has content. What is happening?SerializationException: '试图反序列化一个空流。'我试图反序列化的文件有内容。怎么了?
【发布时间】:2019-02-23 03:15:03
【问题描述】:

总结


我得到了一份创建具有持久性的软件解决方案的任务。但是,我发现我的序列化错误没有意义,因为我试图反序列化的对象有内容并且不是空的。我花了大约 3 个小时来研究不同的版本,以及来自互联网的信息,但没有成功。抱歉,代码块很大,但我找不到它失败的地方。

资源


BinaryFormatter & CryptoStream problem when deserializing

Attempting to deserialize an empty stream?

Runtime error Attempting to deserialize an empty stream

Microsoft Documentation - ISerializable

SerializableAttribute

代码


反序列化

string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\')[1];
            string folderName = "c:\\Users\\"+ userName + "\\Documents";
            string pathString = System.IO.Path.Combine(folderName, "Clients");
            System.IO.Directory.CreateDirectory(pathString);
            string[] FileNames = Directory.GetFiles("C:\\Users\\" + userName + "\\Documents\\Clients\\", "*.clnt")
                .Select(System.IO.Path.GetFileName)
                .ToArray();
            if (FileNames.Length > 0)
            {
                for (int Count = 0; Count <= FileNames.Length; ++Count)
                {

                    FileStream s = new FileStream(FileNames[Count] + ".clnt", FileMode.Open, FileAccess.Read);
                    IFormatter formatter = new BinaryFormatter();
                    ClientDataClass Client = (ClientDataClass)formatter.Deserialize(s);
                    s.Close();
                    ClientComboChoice.Items.Add(Client);
                }
            }

        }

序列化

protected ClientDataClass(SerializationInfo info, StreamingContext context )
{
    StClientBrief = info.GetString(StClientBrief);
    StClientName = info.GetString(StClientName);
    StClientEmail = info.GetString(StClientEmail);
    StartDate = info.GetDateTime(StartDate.ToString());
    DueDate = info.GetDateTime(DueDate.ToString());
    Price = info.GetDouble(Price.ToString());
    SFW = info.GetBoolean(SFW.ToString());
    Planning = info.GetBoolean(Planning.ToString());
    PlanName = info.GetString(PlanName);
}

//[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] Learnt this is obsolete 25/02/2019
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    info.AddValue("ClientName", StClientName);
    info.AddValue("ClientBrief", StClientBrief);
    info.AddValue("ClientEmail", StClientEmail);
    info.AddValue("StartDate", StartDate);
    info.AddValue("DueDate", DueDate);
    info.AddValue("Price", Price);
    info.AddValue("SFW", SFW);
    info.AddValue("Planning", Planning);
    info.AddValue("Plan Name", PlanName);

}

}

证明文件有内容


尝试


我已尝试更改扩展名(它与文件匹配)。我试过删除扩展名。我已经尝试更改数据类的序列化部分。

问题


怎么了?我将来如何避免它?我该如何解决?

【问题讨论】:

  • 你能检查一下 s.Length (FileStream) 吗?如果值等于零,则文件为空。
  • s.length 返回 0。但是,检查目录中的文件,它有内容吗?
  • 查看您的代码,您的问题在于 for 循环(计数
  • 还是不行
  • 啊,我明白了。问题还在于添加+“.clnt”。文件扩展名已经存在。也去掉那一点。 FileStream s = new FileStream(FileNames[Count], FileMode.Open, FileAccess.Read);

标签: c# serialization


【解决方案1】:

因为我不能把它放在 cmets 中:
看起来你试图做的太多了。 我会先分解这些步骤,并在尝试读取文件之前确保您拥有所需的一切。

我的猜测是您将文件名传递给它,但您确实需要传递文件的整个路径。

试试这个。

string[] FileNames = Directory.GetFiles("C:\\Users\\" + userName + "\\Documents\\Clients\\", "*.clnt");
        foreach(string file in FileNames)
{
   FileStream s = new FileStream(file, FileMode.Open, FileAccess.Read);
   IFormatter formatter = new BinaryFormatter();
   ClientDataClass Client = (ClientDataClass)formatter.Deserialize(s);
   s.Close();
   ClientComboChoice.Items.Add(Client);
}

您可以通过以下方式检查文件名

foreach(string file in FileNames)
{
   Console.WriteLine(file);
   //FileStream s = new FileStream(file, FileMode.Open, FileAccess.Read);
   //IFormatter formatter = new BinaryFormatter();
   //ClientDataClass Client = (ClientDataClass)formatter.Deserialize(s);
   //s.Close();
   //ClientComboChoice.Items.Add(Client);
}

如果你可以打开文件,那么我认为你很好,不确定序列化/反序列化操作,但看起来没问题。

【讨论】:

  • 这被证明是成功的,但也暴露了其他错误。
  • 修复它,我搞砸了初始化类
  • 很高兴听到这个消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多