Сериализация объекта до наименьшего UTF8-совместимого размера - PullRequest
3 голосов
/ 27 апреля 2011

У меня есть довольно простой класс, который содержит несколько примитивных типов и некоторые коллекции, в основном с перечислениями.Теперь мне нужно сериализовать этот объект до минимально возможного размера, совместимого с UTF8.

Это класс, который мне нужен для сериализации

public class Context
{
    public Hashtable UserModuleRoles { get; set; }
    public Dictionary<string, object> CustomSettings { get; set; }
    public int Uid { get; set; }
    public int Id { get; set; }
    public int ActiveId { get; set; }
    public byte Default { get; set; }
    public SetEnum Ident { get; set; }
    public string Name { get; set; }
    public sbyte State { get; set; }
    public DateTime Date { get; set; }
}

.

Вот какЯ сериализую объект

public string Serialize(object serializeObject)
{
    MemoryStream stream = new MemoryStream();
    BinaryFormatter b = new BinaryFormatter();

    b.Serialize(stream, serializeObject);

    byte[] data = stream.ToArray();

    stream.Dispose();
    stream = new MemoryStream();

    using (ZipFile zip = new ZipFile())
    {
        zip.AddEntry("data", data);
        zip.Save(stream);
    }

    data = stream.ToArray();
    stream.Dispose();

    return Convert.ToBase64String(data);
}

В моей первой попытке я сериализую объект, заархивирую его содержимое (примерно на 1/3 меньше) и преобразую его в строку base64.Но у base64 довольно большие издержки, равные 1/3, и я знаю, что есть base128, но я не знаю, с чего начать, и мой поиск кодировки base128 был неудачным.

  • Или есть какой-нибудь другой способ сделать это?

  • И если нет, то как лучше всего
    это как base128?

Редактировать:

Я протестировал класс ObjectStateFormatter со всем объектом "Context", что приводит к увеличению на 8 байт и более медленной сериализации / десериализации.Может быть, мне пришлось использовать его только для свойств, а не для всего класса?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Ну, base128 не так сложно, если вы знаете, как это делается с base64.Голландская википедия хорошо описывает процесс (переведенный для вас):

  1. Преобразование данных в двоичные.*
  2. Преобразуйте эти 7 битов в целое число.
  3. Найдите это целое число в определенной вами таблице перевода и добавьте найденный символ в строку base128.

Этот переводтаблица содержит 128 совместимых символов UTF8, например:

0: a
1: b
..
25: z
26: 0

Единственное требование - таблица перевода одинакова как для отправителя, так и для получателя.

0 голосов
/ 28 апреля 2011

Попробуйте использовать objectstateformatter вместо BinaryFormatter, это может дать вам меньший размер.Все зависит от данных вашей сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...