首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化/反序列化时标识dataFile的类型

序列化/反序列化时标识dataFile的类型
EN

Stack Overflow用户
提问于 2021-06-24 16:12:56
回答 1查看 18关注 0票数 0

我有个小问题。我想在c#中反序列化磁盘内存中的文件。一切都进行得很顺利!实际上,它甚至可以工作!除了我希望我的代码是健壮的,所以我测试如果我加载一个与我想要加载的数据不兼容的数据文件会发生什么。

我要加载的数据是List类型的。我尝试加载的是一个文本文件,我插入了一些数字,并去掉了.txt扩展名。然而,我得到了一个异常。

例外:

代码语言:javascript
复制
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处理程序,__BinaryParser serParser,Boolean fCheck,Boolean isCrossAppDomain,IMethodCallMessage methodCallMessage) BinaryFormatter.Deserialize(流serializationStream,Boolean处理程序,Boolean HeaderHandler,Boolean fCheck,Boolean isCrossAppDomain,IMethodCallMessage methodCallMessage) BinaryFormatter.Deserialize(流serializationStream) OrderAdministration.Load(String )行119行198

我已经使用了fileStream.GetType()来验证对象的类型是否正确,但是我没能让它编译,我遗漏了一些东西。下面我将展示单元测试及其使用的函数。提前感谢!:D

单元测试:

代码语言:javascript
复制
[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);
    }

Load函数:

代码语言:javascript
复制
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>;
            }
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2021-06-24 20:23:08

这一点:

我想要加载的数据是List类型的。我尝试加载的是一个文本文件,我插入了一些数字,并去掉了.txt扩展名。

还有这个:

新建BinaryFormatter格式=

BinaryFormatter();

不兼容。BinaryFormatter以类似于在内存中表示数据的方式写入二进制数据,它绝对不是基于文本的,我不建议使用它。

有许多不同的方法可以序列化数据,可以是基于文本的,也可以是二进制的。它既可以遵循定义的通用格式,如json或xml,也可以遵循自定义格式。

如果您只想存储一个数字列表,那么可以在每行中放入一个数字,使用[File.ReadAllLines][2]读取文件,并使用double.TryParseint.TryParse解析每一行

如果您正在序列化对象,我建议您使用带有good library的Json这样的格式来读/写对象。这可能是目前最常见的数据存储方式。

我已经使用了fileStream.GetType()来验证这个对象

这不起作用。GetType返回fileStream的类型,即FileStream,而不是序列化对象的类型。文件本身需要包含序列化数据的类型。有些序列化格式可以用标准化的方式来实现这一点,有些格式会在文件前面加上一个特定文件格式所特有的魔术数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68111967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档