Привет!
Есть библиотека 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;
}
но оно не универсально, придется для каждой структуры писать подобный велосипед.
Есть ли решения (желательно не сторонние), которые позволяет сериализовать произвольную структуру (с базовыми типами) в бинарный формат?