用于非常大的数据的XMLSerializer的替代方案

时间:2013-10-14 17:02:08

标签: c# serialization xmlserializer

现在我正在尝试将大量内存数据保存到我的硬盘中。它目前正在尝试使用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();

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-2)

我会使用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最小化器使它更小。