【发布时间】: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
代码
反序列化
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