2013-11-17 4 views
-1

У меня есть ссылочный тип, который содержит необработанные данные изображения в неуправляемой памяти. Понятно, как хранить метаданные (ширина, высота) с помощью SerializationInfo, но что является лучшим способом хранения BLOB?Как должен ISerializable объект хранить двоичные данные?

Единственное, что я вижу, это использовать Convert.ToBase64String, который требует целую кучу копирования. Есть ли более простой способ?

ответ

2

Обновление: Есть намного лучший способ справиться с этим!

Что вам нужно сделать, это посмотреть на StreamingContext, пройденный до GetObjectData, свойство StreamingContext.State может сообщить вам, что такое сериализация. Если вы пройдете состояние Clone или CrossAppDomain, вы сможете повторно использовать существующие ручки, которые у вас есть для неуправляемого блоба, и просто передать указатели на дескриптор в объект SerializationInfo.


Вам нужно будет, чтобы сделать кучу копирования независимо от того, что вы выбираете, но Convert.ToBase64String не нужна, вы можете просто сериализовать управляемый byte[] вы прошли, чтобы Convert.ToBase64String и что должно быть в порядке.


Я не знаю, есть ли особый случай Efficency для byte[], однако все Seralizations get turned in to a byte stream в процессе передачи. Так путем кодирования в Base64 вы собираетесь делать

  1. Прочитайте неуправляемый сгусток и преобразовать его в управляемый byte[]
  2. Преобразование byte[] в к string через ToBase64String (увеличение размера на коэффициент/в связи с кодированием)
  3. Pass закодированной строки с именем тега в SerializationInfo к
  4. Pass остальной части метаданных в к SerializationInfo с их respetive теги
  5. сериализатора принимает все теги + объект комбо и превращает их в поток байтов, которые будут переданы к месту назначения
  6. десериализатор принимает поток байтов и превращает его обратно в коллекцию о тегах и объектах
  7. Вы получаете обратно string назад с помощью тегов, что и имя тега.
  8. Вы возвращаете свои метаданные, используя теги, которые вы их сохранили.
  9. Преобразовать string обратно к byte[] через FromBase64String
  10. Преобразовать byte[] обратно в неуправляемый блоб.

Если вы никогда не кодировать строку и просто передать byte[] в качестве объекта к SerializationInfo объекта шаги в значительной степени то же самое, он просто не имеет, что/увеличения размера datablob для кодирования двоичных данных в виде текста.

  1. Прочитайте неуправляемый сгусток и преобразовать его в управляемый byte[]
  2. Пропустите byte[] с именем тега в к SerializationInfo
  3. Пропустите оставшуюся часть метаданных к SerializationInfo с их respetive теги
  4. Сериализатор принимает все комбинации тегов + объектов и превращает их в поток байтов, который должен быть передан в пункт назначения
  5. Deserializer принимает поток байтов и возвращает его обратно в коллекцию тегов и объекты
  6. Вы получаете обратно byte[] назад с помощью тегов, что и название файла.
  7. Вы возвращаете свои метаданные, используя теги, которые вы их сохранили.
  8. Конвертировать byte[] обратно в неуправляемый двоичный блок.

Так что, я думаю, что «оптимизация» передается, поскольку byte[] имеет преимущество в том, что вы не увеличиваете объем данных, которые вы должны передать на десуризатор.

+0

Это несчастливо. Является ли 'byte []' специально для эффективности, знаете ли вы, или он собирается хранить метаданные, за которыми следует каждый отдельный элемент, в качестве отдельного элемента? Есть ли другой простой способ просто спрятать несколько объектов между прогонами программы? –

+0

Я добавил подробное обновление, чтобы ответить на первую часть вашего вопроса. Для вашего второго вопроса это зависит от вашей цели: простейшая реализация, минимальный размер, удобочитаемость, поддержка кросс-платформенной поддержки, поддержка версии .NET Framework? (если ответ на последний «нет», то ['BinaryFormmater'] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter%28v=vs .110% 29.aspx) может быть «самым простым» решением)? –

+0

@BenVoigt Я не думал раньше, Да, любой объект, который передается в [this overload] (http://msdn.microsoft.com/en-us/library/vstudio/skf8dbad.aspx) из 'AddValue ('*** может быть *** оптимизировано.Что произойдет, это будет называть' GetObjectData() 'на передаваемом объекте, а вложенный искатель выполняет любые оптимизации, которые он выбирает делать (так что это зависит от серализатора для 'Array', чтобы определить, есть ли какие-либо оптимизации или нет) –

Смежные вопросы