【发布时间】:2021-09-07 17:24:00
【问题描述】:
我有一个小问题。我想在 c# 中从磁盘内存中反序列化一个文件。一切进展顺利!实际上,它甚至可以工作!除了 id 像我的代码一样健壮,所以我测试如果我加载的数据文件与我要加载的数据不兼容会发生什么。
我要加载的数据是 List 类型的。我试图加载的是一个文本文件,我在其中插入了一些数字并去掉了 .txt 扩展名。但是我遇到了一个例外。
例外:
Test method GuitarWorkshopTests.OrderAdministrationTests.Test_Load_NonAnimal_Class threw exception:
System.Runtime.Serialization.SerializationException: Het eind van de stroom is bereikt voordat parsering is voltooid.
堆栈跟踪: __BinaryParser.Run() ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) BinaryFormatter.Deserialize(流序列化流) OrderAdministration.Load(字符串文件名)第 119 行 OrderAdministrationTests.Test_Load_NonAnimal_Class() 第 198 行
我摆弄了 fileStream.GetType() 来验证对象的类型是否正确,但我无法使其编译,我错过了一些东西。下面我将展示单元测试及其使用的功能。提前致谢! :D
单元测试:
[TestMethod]
public void Test_Load_NonAnimal_Class()
{
InjectorClass injector = new InjectorClass();
injector.Administration.Load(@"C:\Users\MyName\Desktop\x");
Assert.AreEqual(true, injector.Administration.Orders.Count);
}
加载函数:
public void Load(String fileName)
{
if (fileName == null)
{
throw new ArgumentNullException("fileName");
}
String path = @Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\GuitarWorkshop\" + fileName;
if (fileName.Contains(@"\"))
{
path = fileName;
}
else
{
String direc = @Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\GuitarWorkshop";
if (!Directory.Exists(direc))
{
Directory.CreateDirectory(direc);
}
}
using (FileStream fileStream = File.OpenRead(path))
{
BinaryFormatter format = new BinaryFormatter();
if(fileStream.Length > 0)
{
Orders = format.Deserialize(fileStream) as List<Order>;
}
}
}
【问题讨论】:
-
二进制格式化程序反序列化仅在使用二进制格式化程序序列化数据时才有效。二进制格式化程序将类型添加到序列化数据中,因此反序列化方法将起作用。
-
BinaryFormatter 不会正确反序列化损坏的二进制数据。
fileStream.GetType()与流(文件)类型无关。它是关于fileStream实例 .Net 类型,您的示例是FileStream。
标签: c# object serialization binary formatting