确定。我知道如何使用序列化等,但由于这仅适用于已标记为序列化属性的对象 - 我如何在不使用序列化的情况下加载数据并在应用程序中使用它?说一个数据文件。
或者,创建一个带有序列化的datacontainer,该序列化保存未序列化的文件。
我使用的方法是二进制序列化和XML序列化。可以加载未知数据的任何其他方式,也许以某种方式在C#中使用它?
答案 0 :(得分:3)
使用JSON.NET
的JSON序列化吃一切!包括匿名类型。
修改强>
我知道你说过“你不想要序列化”,但根据你的声明“[...]标有Serialization属性的对象”,我相信你没有尝试使用JSON.NET进行JSON序列化!
答案 1 :(得分:3)
也许对术语的定义是有序的;序列化是“将数据结构或对象状态转换为可以在相同或另一个计算机环境中存储和”复活“的格式的过程”。几乎所有将“易失性”内存转换为持久数据并返回的方法都是“序列化”,所以即使你推行自己的方案来实现它,你也要“序列化”。
那就是说,听起来你根本就不想使用.NET二进制序列化。这实际上是正确的想法;二进制序列化很简单,但非常依赖于代码和环境。将可序列化类移动到不同的命名空间,或使用Microsoft CLR序列化文件,然后尝试在Mono中反序列化它可能会破坏二进制序列化。
首先,您必须能够根据文件确定应尝试创建的对象类型。你根本无法打开一些“随机”文件,并希望能够从中获得任何有意义的信息而不知道数据在文件中的结构。最简单的方法是让文件告诉您,通过指定它创建的对象的类型名称(您希望在代码库中可以使用它)。大多数内置序列化器都是这样做的。文件可以告知消费者其格式的其他方式包括文件,行和/或字段标题代码(在旧标准中非常常见,因为它们节省了文件大小)和扩展/ MIME类型。
通过整理,可以进行反序列化。如果文件是使用内置序列化程序序列化的,只需使用它,但如果它是较旧的格式(CSV,固定长度),那么你必须逐行解析文件到代表行的对象,在表示文件的主对象。
查看ETL(Extract-Transform-Load)流程模式。这是一个模块化,可扩展的架构模式,用于获取文件并将其转换为程序可以使用的数据:
答案 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.