.net 如何选择文件格式?

.net 如何选择文件格式?,.net,file-format,.net,File Format,几年前,我创建了一个.NET应用程序,但没有仔细考虑文件格式:它使用soap格式化程序来序列化我们庞大的对象层次结构。这很简单,所以我没怎么考虑 考虑到以下问题,我现在尝试提出一种更为优化的文件格式: 当一个文件被保存时,它最终被转换成字节数组,并通过网络发送到数据库进行存储。这最终会成为一个大问题,因为所有对象都在内存中,然后为序列化程序分配更多内存,然后为字节数组分配更多内存。即使大小适中的对象图最终也会使用大量内存来保存文件 我不知道如何从文件格式的角度以及从算法的角度(对象->流->字节

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

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

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

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


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

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

序列化对象时,请使用属性而不是节点。使用节点会浪费大量空间。通过在属性/字段上方添加[XmlAttribute]标记,可以很容易地实现这一点


参考链接:

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

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

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

我使用这些库对存储到数据库中的数据进行压缩。例如从36000到6000。它的使用非常简单,并且您不必将数据存储为二进制文件,它也可以是字符串。

+=压缩的持久化对象

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; }
    }
}