0

现在我正在尝试将大量内存数据保存到我的硬盘驱动器中。它目前正在尝试使用 XMLSerializer 保存一个包含 400,000 条记录的表。这可以正常工作,但 xml 文件的大小超过 1 gig。我所有的类都实现了[Serializable()]。我的数据在并发队列中,我在序列化之前将其转换为 List<>。

我的问题是:是否有更好、更快的序列化程序可以创建更小的文件?较小的文件是我想要的最重要的东西。

编辑:该文件不需要是人类可读的。目标是能够以最小的占用空间和最快的速度将数十万条记录保存到磁盘上。我正在研究二进制序列化,但遇到“内存系统”错误的问题。我正在尝试查看是否有一种方法可以直接写入我的磁盘,而无需先将所有数据加载到内存中。内存映射文件可能是一个选项。

我还可以选择使用 sql server 2008 进行存储。如果应用程序可以访问数据库,我计划将其用作辅助存储单元,如果没有,则将文件存储在计算机上。

        var xml = new XmlSerializer(typeof(List<pPeople>));
        FileStream fs = new FileStream(@"C:\Users\...\Desktop\TestLogFile.xml", FileMode.Create);
        TextWriter tw = new StreamWriter(fs);
        xml.Serialize(tw, peoplePeople.ToList<pPeople>());
        tw.Close();
        fs.Close();

        //Deserialize
        FileStream openFS = new FileStream(@"C:\Users\...\Desktop\TestLogFile.xml", FileMode.Open);
        var savedPeople = (List<pPeople>)xml.Deserialize(openFS);
        peoplePeople = (ConcurrentQueue<pPeople>)savedPeople.Cast<ConcurrentQueue<pPeople>>();
        openFS.Close();
4

2 回答 2

1

如果您想要一个小而快速的文件,请不要使用序列化程序,并且绝对不要使用 xml。在您的类上实现仅将基本数据保存和加载到二进制流的方法。

于 2013-10-14T18:08:19.520 回答
-3

我会使用JSON.NET而不是 XML。.NET 生成更小的文件,它的解析速度比 XML 快。但是,如果您打算使用 XSLT 将 XML 转换为其他任何东西,我建议您坚持使用 XML。这里有些例子:

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Sizes = new string[] { "Small" };

string json = JsonConvert.SerializeObject(product);
//{
//  "Name": "Apple",
//  "Expiry": "2008-12-28T00:00:00",
//  "Sizes": [
//    "Small"
//  ]
//}

如您所见,它比 XML 更简洁。然后,您可以使用 javascript 最小化器使其更小。

于 2013-10-14T18:36:05.607 回答