2012-07-17 62 views
2

好的。我知道如何使用序列化等,但因为它只适用于已标记为序列化属性的对象 - 我如何加载数据并在不使用序列化的情况下在应用程序中使用它?说一个数据文件。加载/保存数据的替代方法 - 无需序列化?

或者,创建一个带有序列化的datacontainer,用于存放未序列化的文件。

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

+0

看看mongoDB – Samson 2012-07-17 15:22:20

+0

是的,但是说我想将一些原始数据加载到应用程序中。试图序列化一个随机文件会使它寻找一个创建数据文件的类。 – Deukalion 2012-07-17 15:24:17

回答

3

JSON序列化使用JSON.NET

一切!包括匿名类型。

编辑

我知道你说“你不想要的序列化”,而是根据你的陈述“[...]这是标有序列化属性对象”,我相信你没有尝试使用JSON.NET进行JSON序列化!

+0

...因此,我可以存储一个DataContainer,它包含几个未标记序列化的项目(类)? – Deukalion 2012-07-17 15:45:02

+1

正如我在回答中所说的那样,它**吃尽一切**。它不需要'[Serializable]。 – 2012-07-17 18:44:53

+0

我无法找到你说的内容,我试过JSonConverting.Deserialize(东西),它没有加载文件。 – Deukalion 2012-07-18 13:56:06

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.

3

也许术语的定义是有序的;序列化是“将数据结构或对象状态转换为可在相同或其他计算机环境中稍后存储和”复活“的格式的过程。”几乎任何将“易失性”内存转换为持久性数据的方法,后退都是“序列化”,所以即使您将自己的方案转换为“序列化”,也是如此。

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

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

随着整理,反序列化可以发生。如果使用内置序列化程序对文件进行序列化,只需使用该序列化程序即可,但如果是较旧的格式(CSV,固定长度),则必须逐行将文件解析为代表行中的对象,并将其收集到代表文件的主要对象。

查看ETL(Extract-Transform-Load)过程模式。这是一个模块化的,可扩展的架构,以文件并将它们转化为数据,程序可以工作模式:

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