C# 加载/保存数据的替代方法-无序列化?

C# 加载/保存数据的替代方法-无序列化?,c#,serialization,data-storage,data-containers,C#,Serialization,Data Storage,Data Containers,嗯。我知道如何使用序列化等,但既然这只适用于标记了序列化属性的对象,那么我如何在不使用序列化的情况下加载数据并在应用程序中使用它呢?比如说数据文件 或者,创建一个具有序列化的数据容器,其中包含未序列化的文件 我使用的方法是二进制序列化和XML序列化。可以加载未知数据并以某种方式在C#?JSON序列化中使用它的任何其他方法 这东西什么都吃!包括匿名类型 编辑 我知道您说过“您不想序列化”,但根据您的语句“[…]已标记为序列化属性的对象”,我相信您没有尝试使用JSON.NET进行JSON序列化 传统

嗯。我知道如何使用序列化等,但既然这只适用于标记了序列化属性的对象,那么我如何在不使用序列化的情况下加载数据并在应用程序中使用它呢?比如说数据文件

或者,创建一个具有序列化的数据容器,其中包含未序列化的文件

我使用的方法是二进制序列化和XML序列化。可以加载未知数据并以某种方式在C#?

JSON序列化中使用它的任何其他方法

这东西什么都吃!包括匿名类型

编辑


我知道您说过“您不想序列化”,但根据您的语句“[…]已标记为序列化属性的对象”,我相信您没有尝试使用JSON.NET进行JSON序列化

传统的方法是使用流访问操作并读取所需的数据。通过这种方式,您几乎可以读取/写入任何文件。 序列化只是基于某种契约自动执行此过程

根据你的评论,我猜你的要求是在没有合同的情况下阅读任何类型的文件

假设您有一个原始文件,第一个字节指定字符串的长度,下一组字节表示字符串

例如,
5 | H | e | l | l | o

var stream = File.Open(filename);
var length = stream.ReadByte();
byte[] b = new byte[length];

stream.Read(b, 0, length);

var string = Encoding.ASCII.GetString(b);
二进制I/O是原始的。
也许术语的定义是正确的;序列化是“将数据结构或对象状态转换为可在同一或另一计算机环境中存储和“恢复”的格式的过程”。几乎所有将“易失性”内存转换为持久性数据并返回的方法都是“序列化”,因此,即使您使用自己的方案来实现,您也在“序列化”

也就是说,听起来您只是不想使用.NET二进制序列化。这实际上是正确的想法;二进制序列化很简单,但非常依赖于代码和环境。将可序列化类移动到其他命名空间,或使用Microsoft CLR序列化文件,然后尝试在Mono中对其进行反序列化,可能会中断二进制序列化

首先也是最重要的一点是,您必须能够确定应该基于文件创建什么类型的对象。在不知道文件中的数据结构的情况下,您无法打开某个“随机”文件并期望能够从中获得任何有意义的内容。最简单的方法是让文件告诉您,方法是指定从中创建它的对象的类型名(希望在代码库中可以使用该名称)。大多数内置序列化程序都是这样做的。文件通知用户其格式的其他方式包括文件、行和/或字段头代码(在旧标准中非常常见,因为它们节省了文件大小)和扩展名/MIME类型

解决了这个问题后,反序列化就可以进行了。如果文件是使用内置序列化程序序列化的,只需使用该序列化程序即可,但如果是较旧的格式(CSV,固定长度),则必须逐行将文件解析为表示行的对象,这些对象收集在表示文件的主对象中

看看ETL(提取转换加载)过程模式。这是一种模块化、可扩展的体系结构模式,用于获取文件并将其转换为程序可以处理的数据:

  • 提取-系统的这一部分指向文件系统,或其他传入的原始数据“管道”,其任务是打开文件,将数据提取为可以进一步操作的非常基本的对象格式,并将这些对象放入内存中的“队列”中进行转换。目标是尽可能快速高效地从管道中获取数据,但此时需要您对正在处理的数据有一些了解,以便能够有效地将其封装以供进一步处理;实际上,将数据转换为您真正想要的格式将在以后进行
  • 转换-系统的这一部分获取提取的数据,并执行将这些数据从代码库中放入水合对象的逻辑。在这里,给定提取步骤中有关提取数据的文件类型的信息,可以实例化表示数据模型的域对象,将原始数据切片为将存储为数据成员的块,执行任何类型转换(从文件中获取的数据通常是字符串格式或原始位,必须进行封送处理或以其他方式转换为更好地表示数据概念的数据类型),并验证新对象的内部结构是否一致,以及是否符合已知的业务规则。水合的有效对象将放置在输出队列中,以供加载步骤处理
  • 加载-此步骤从转换步骤中获取水合的有效业务对象,并将它们持久化到系统使用的数据存储中(例如SQL数据库或程序的本机平面文件格式)

是的,但假设我想将一些原始数据加载到应用程序中。尝试序列化一个随机文件会使它查找创建数据文件的类……因此,通过此操作,我可以存储一个包含多个项(类)的数据容器也没有标记序列化?正如我在回答中所说,它会吃掉所有东西。它不需要“[Serializable]”。我在你所说的内容的引用中找不到任何内容,我尝试了JSonConverting。反序列化(某些内容),但它无法加载文件。