如何选择文件格式?

时间:2009-06-11 02:39:00

标签: .net file-format

我几年前创建了一个.NET应用程序而没有过多考虑文件格式:它使用soap格式化程序来序列化我们的大型对象层次结构。这很简单,所以我没有多想。

考虑到以下问题,我现在正试图提出更优的文件格式: 保存文件时,它最终会转换为字节数组,并通过网络发送到数据库进行存储。这最终成为一个大问题,因为你拥有内存中的所有对象,然后为序列化器分配更多内存,然后为字节数组分配更多内存。即使是适度大小的对象图也会使用大量内存来处理保存文件。

我不确定如何从文件格式的角度改进这一点,但也可能从算法的角度来看(对象 - >流 - >字节数组)

更新的: 我总是在通过线路发送之前压缩字节数组,所以虽然这是一个很好的建议,但它已经在我的应用程序中实现了。

我确实从Soap转换为二进制序列化,这已经产生了巨大的差异:我们的文件比以前小了大约7倍。 (当然,你的里程可能会有所不同)。

6 个答案:

答案 0 :(得分:4)

如果您需要高效的序列化,并且不关心它是否被序列化为二进制格式,那么只需在.NET中使用标准二进制序列化。您可以使用[Serializable]属性装饰可序列化类型,并使用BinaryFormatter将对象序列化为byte []。

答案 1 :(得分:3)

如果你还没有尝试过,那么一个非常快速的解决方案。它不会完全减少开销,但会有所帮助。

序列化对象时,请使用属性而不是节点。使用节点有很多浪费的空间。您可以通过在属性/字段上添加[XmlAttribute]标记来轻松完成此操作。

参考链接:http://msdn.microsoft.com/en-us/library/2baksw0z(VS.71).aspx

答案 2 :(得分:3)

BinaryFormatter + DeflateStream =压缩的持久对象

using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;

namespace CompressedSerialized
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj1 = new MyObject() { Prop1 = "p1", Prop2 = "p2" };
            MyObject obj2 = null;
            var bin = new BinaryFormatter();
            byte[] buffer = null;

            using (var ms = new MemoryStream())
            {
                using (var zip = new DeflateStream(ms, CompressionMode.Compress))
                {
                    bin.Serialize(zip, obj1);
                    zip.Flush();
                }
                buffer = ms.ToArray();
            }

            using (var ms = new MemoryStream(buffer))
            using (var unzip = new DeflateStream(ms, CompressionMode.Decompress))
            {
                var des = bin.Deserialize(unzip);
                obj2 = des as MyObject;
            }

        }
    }

    [Serializable]
    public class MyObject
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
    }
}

答案 3 :(得分:1)

您也可以尝试使用压缩/压缩流,我认为从内存中SharpZipLib允许您创建压缩流。

答案 4 :(得分:0)

为什么不将应用程序从XML移到JSON?有许多库可以在.NET中序列化/反序列化JSON。

答案 5 :(得分:0)

我使用LZMA来压缩我存储到数据库的数据。例如,将事物从36,000提取到6000.使用起来非常简单,并且您不必将数据存储为二进制文件,也可以是字符串。