加载/保存数据的其他方法 - 没有序列化?

时间:2012-07-17 15:20:22

标签: c# serialization data-storage data-containers

确定。我知道如何使用序列化等,但由于这仅适用于已标记为序列化属性的对象 - 我如何在不使用序列化的情况下加载数据并在应用程序中使用它?说一个数据文件。

或者,创建一个带有序列化的datacontainer,该序列化保存未序列化的文件。

我使用的方法是二进制序列化和XML序列化。可以加载未知数据的任何其他方式,也许以某种方式在C#中使用它?

3 个答案:

答案 0 :(得分:3)

使用JSON.NET

的JSON序列化

一切!包括匿名类型。

修改

我知道你说过“你不想要序列化”,但根据你的声明“[...]标有Seri​​alization属性的对象”,我相信你没有尝试使用JSON.NET进行JSON序列化!

答案 1 :(得分:3)

也许对术语的定义是有序的;序列化是“将数据结构或对象状态转换为可以在相同或另一个计算机环境中存储和”复活“的格式的过程”。几乎所有将“易失性”内存转换为持久数据并返回的方法都是“序列化”,所以即使你推行自己的方案来实现它,你也要“序列化”。

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

首先,您必须能够根据文件确定应尝试创建的对象类型。你根本无法打开一些“随机”文件,并希望能够从中获得任何有意义的信息而不知道数据在文件中的结构。最简单的方法是让文件告诉您,通过指定它创建的对象的类型名称(您希望在代码库中可以使用它)。大多数内置序列化器都是这样做的。文件可以告知消费者其格式的其他方式包括文件,行和/或字段标题代码(在旧标准中非常常见,因为它们节省了文件大小)和扩展/ MIME类型。

通过整理,可以进行反序列化。如果文件是使用内置序列化程序序列化的,只需使用它,但如果它是较旧的格式(CSV,固定长度),那么你必须逐行解析文件到代表行的对象,在表示文件的主对象。

查看ETL(Extract-Transform-Load)流程模式。这是一个模块化,可扩展的架构模式,用于获取文件并将其转换为程序可以使用的数据:

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

答案 2 :(得分:0)

嗯,老式的方法是使用流访问操作并读出您想要的数据。这样你几乎可以读/写任何文件。 序列化只是根据某些合同自动执行此过程。

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

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

例如,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是原始的。 Check MSDN for more.