MikhailD
@MikhailD
Developer

Сериализация в PCL

Привет!
Есть библиотека PCL (Portable Class Library) использующаяся в Windows Store и Windows Phone 8 проектах.
В этой библиотеки есть структуры, имеющие несколько полей базовых типов:
private FieldTypes _type;
private string _name;
private string _value;

нужно сериализовать эти структуры и получить массив байтов.
Если использовать DataContractSerializer - на выходе получим XML, который является сильно избыточным и увеличивает размер сохраняемых данных. У меня данных будет много, в том числе могут быть бинарные данные (картинки), которые не хотелось бы кодировать в base64, т.к. размер вырастит еще на треть, следовательно XML не подходит.

Сейчас я нашел такое решение (для приведенных выше данных):
internal byte[] ToBinary()
        {
            byte[] binaryType = BitConverter.GetBytes((int)_type);

            byte[] binaryNameLength = BitConverter.GetBytes(_name.Length);
            byte[] binaryName = new byte[_name.Length * sizeof(char)];
            Buffer.BlockCopy(_name.ToCharArray(), 0, binaryName, 0, binaryName.Length);

            byte[] binaryValueLength = BitConverter.GetBytes(_value.Length);
            byte[] binaryValue = new byte[_value.Length * sizeof(char)];
            Buffer.BlockCopy(_value.ToCharArray(), 0, binaryValue, 0, binaryValue.Length);

            int resultLength = binaryType.Length + binaryNameLength.Length + binaryName.Length + binaryValueLength.Length + binaryValue.Length;
            byte[] result = new byte[resultLength];

            Buffer.BlockCopy(binaryType, 0, result, 0, binaryType.Length);
            Buffer.BlockCopy(binaryName, 0, result, binaryType.Length, binaryName.Length);
            Buffer.BlockCopy(binaryNameLength, 0, result, binaryType.Length + binaryName.Length, binaryNameLength.Length);
            Buffer.BlockCopy(binaryValueLength, 0, result, binaryType.Length + binaryName.Length + binaryNameLength.Length, binaryValueLength.Length);
            Buffer.BlockCopy(binaryValue, 0, result, binaryType.Length + binaryName.Length + binaryNameLength.Length + binaryValueLength.Length, binaryValue.Length);

            return result;
        }

но оно не универсально, придется для каждой структуры писать подобный велосипед.

Есть ли решения (желательно не сторонние), которые позволяет сериализовать произвольную структуру (с базовыми типами) в бинарный формат?
  • Вопрос задан
  • 2444 просмотра
Пригласить эксперта
Ответы на вопрос 2
BinaryFormatter?
UPD: прошу прощения, не заметил фразы про Windows Store.

Посмотрите UniversalSerializer, он должен это уметь.
Ответ написан
Комментировать
@Oxoron
Шарпер
Проблему можно решить маршализацией (маршалингом).
habrahabr.ru/post/114953 - здесь отличная статья: баланс между теорией, практикой и размером.
www.cyberforum.ru/csharp-net/thread342135.html#a_53 - здесь подробное описание.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы