4

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

考虑到以下问题,我现在正在尝试提出一种更优化的文件格式:保存文件时,它最终被转换为字节数组并通过线路发送到数据库进行存储。这最终成为一个大问题,因为您将所有对象都放在内存中,然后为序列化程序分配更多内存,然后为字节数组分配更多内存。即使是中等大小的对象图最终也会使用大量内存来保存文件。

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

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

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

4

6 回答 6

4

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

于 2009-06-11T02:53:28.583 回答
3

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

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

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

于 2009-06-11T02:49:59.010 回答
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; }
    }
}
于 2009-06-11T03:06:02.473 回答
1

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

于 2009-06-11T02:52:16.150 回答
0

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

于 2009-06-11T02:55:30.700 回答
0

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

于 2009-06-11T03:03:41.667 回答