【问题标题】:How to choose a file format?如何选择文件格式?
【发布时间】:2009-06-11 02:39:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: .net file-format


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-07-13
                • 2012-08-01
                • 1970-01-01
                • 2020-06-05
                • 2014-01-24
                • 2011-11-12
                • 2016-01-29
                • 1970-01-01
                相关资源
                最近更新 更多