Как выбрать формат файла?

Я создал приложение.NET много лет назад, не задумываясь о формате файла: он использует мыльный форматер для сериализации нашей большой иерархии объектов. Это было очень просто, и я не задумывался об этом.

Сейчас я пытаюсь найти более оптимальный формат файла, учитывая следующую проблему: при сохранении файла он преобразуется в байтовый массив и отправляется по проводам в базу данных для хранения. Это становится большой проблемой, потому что у вас есть все ваши объекты в памяти, затем вы выделяете больше памяти для сериализатора, а затем вы выделяете еще больше памяти для байтового массива. Даже графы объектов небольшого размера в конечном итоге используют много памяти для сохранения файла.

Я не уверен, как улучшить это как с точки зрения формата файла, так и потенциально с точки зрения алгоритма (объекты -> поток -> байтовый массив)

ОБНОВЛЕНИЕ: я всегда архивировал байтовый массив перед отправкой по проводам, так что, хотя это хороший совет, он уже был реализован в моем приложении.

Я конвертировал из Soap в двоичную сериализацию, и это имело огромное значение: наши файлы примерно в 7 раз меньше, чем раньше. (Ваш пробег может меняться, конечно).

6 ответов

Решение

Если вам нужна эффективная сериализация, и вам все равно, сериализуется ли она в двоичном формате, просто используйте стандартную двоичную сериализацию в.NET. Вы можете просто декорировать ваши сериализуемые типы с помощью атрибута [Serializable] и использовать BinaryFormatter для сериализации ваших объектов в byte[].

Одно очень быстрое решение, если вы еще не пробовали. Это не собирается полностью уменьшить накладные расходы, но поможет.

Когда вы сериализуете свои объекты, используйте атрибуты вместо узлов. Существует много потерянного пространства с использованием узлов. Вы можете легко сделать это, добавив тег [XmlAttribute] над свойством / полем.

Ссылка Ссылка: http://msdn.microsoft.com/en-us/library/2baksw0z(VS.71).aspx

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

Вы также можете попробовать использовать сжатый / сжатый поток, я думаю, что из памяти SharpZipLib позволяет создавать сжатые потоки.

Почему бы не переместить приложение из XML в JSON? Существует ряд библиотек, которые могут сериализовать / десериализовать JSON в.NET.

Я использовал LZMA для сжатия данных, которые я храню в базе данных. Например, получение значений от 36 000 до 6000. Это действительно просто в использовании, и вам не нужно хранить данные просто в виде двоичного файла, это также может быть строка.

Другие вопросы по тегам