Обновление: Есть намного лучший способ справиться с этим!
Что вам нужно сделать, это посмотреть на StreamingContext
, пройденный до GetObjectData
, свойство StreamingContext.State
может сообщить вам, что такое сериализация. Если вы пройдете состояние Clone
или CrossAppDomain
, вы сможете повторно использовать существующие ручки, которые у вас есть для неуправляемого блоба, и просто передать указатели на дескриптор в объект SerializationInfo
.
Вам нужно будет, чтобы сделать кучу копирования независимо от того, что вы выбираете, но Convert.ToBase64String
не нужна, вы можете просто сериализовать управляемый byte[]
вы прошли, чтобы Convert.ToBase64String
и что должно быть в порядке.
Я не знаю, есть ли особый случай Efficency для byte[]
, однако все Seralizations get turned in to a byte stream в процессе передачи. Так путем кодирования в Base64 вы собираетесь делать
- Прочитайте неуправляемый сгусток и преобразовать его в управляемый
byte[]
- Преобразование
byte[]
в к string
через ToBase64String
(увеличение размера на коэффициент/в связи с кодированием)
- Pass закодированной строки с именем тега в
SerializationInfo
к
- Pass остальной части метаданных в к
SerializationInfo
с их respetive теги
- сериализатора принимает все теги + объект комбо и превращает их в поток байтов, которые будут переданы к месту назначения
- десериализатор принимает поток байтов и превращает его обратно в коллекцию о тегах и объектах
- Вы получаете обратно
string
назад с помощью тегов, что и имя тега.
- Вы возвращаете свои метаданные, используя теги, которые вы их сохранили.
- Преобразовать
string
обратно к byte[]
через FromBase64String
- Преобразовать
byte[]
обратно в неуправляемый блоб.
Если вы никогда не кодировать строку и просто передать byte[]
в качестве объекта к SerializationInfo
объекта шаги в значительной степени то же самое, он просто не имеет, что/увеличения размера datablob для кодирования двоичных данных в виде текста.
- Прочитайте неуправляемый сгусток и преобразовать его в управляемый
byte[]
- Пропустите
byte[]
с именем тега в к SerializationInfo
- Пропустите оставшуюся часть метаданных к
SerializationInfo
с их respetive теги
- Сериализатор принимает все комбинации тегов + объектов и превращает их в поток байтов, который должен быть передан в пункт назначения
- Deserializer принимает поток байтов и возвращает его обратно в коллекцию тегов и объекты
- Вы получаете обратно
byte[]
назад с помощью тегов, что и название файла.
- Вы возвращаете свои метаданные, используя теги, которые вы их сохранили.
- Конвертировать
byte[]
обратно в неуправляемый двоичный блок.
Так что, я думаю, что «оптимизация» передается, поскольку byte[]
имеет преимущество в том, что вы не увеличиваете объем данных, которые вы должны передать на десуризатор.
Это несчастливо. Является ли 'byte []' специально для эффективности, знаете ли вы, или он собирается хранить метаданные, за которыми следует каждый отдельный элемент, в качестве отдельного элемента? Есть ли другой простой способ просто спрятать несколько объектов между прогонами программы? –
Я добавил подробное обновление, чтобы ответить на первую часть вашего вопроса. Для вашего второго вопроса это зависит от вашей цели: простейшая реализация, минимальный размер, удобочитаемость, поддержка кросс-платформенной поддержки, поддержка версии .NET Framework? (если ответ на последний «нет», то ['BinaryFormmater'] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter%28v=vs .110% 29.aspx) может быть «самым простым» решением)? –
@BenVoigt Я не думал раньше, Да, любой объект, который передается в [this overload] (http://msdn.microsoft.com/en-us/library/vstudio/skf8dbad.aspx) из 'AddValue ('*** может быть *** оптимизировано.Что произойдет, это будет называть' GetObjectData() 'на передаваемом объекте, а вложенный искатель выполняет любые оптимизации, которые он выбирает делать (так что это зависит от серализатора для 'Array', чтобы определить, есть ли какие-либо оптимизации или нет) –