Сериализация .NET Array в XML в качестве базы 64? - PullRequest
1 голос
/ 20 марта 2009

Я пишу собственный сериализатор .NET на C # и хочу читать и записывать объекты Array в XML с использованием XmlReader и XmlWriter. Я хотел бы base64-кодировать массив. Массивы могут быть 1-, 2- или 3-мерными, а элементы являются типами bool или numeric.

Я полностью в тупике. XmlReader и XmlWriter имеют методы для чтения / записи массивов Byte [] как base64, но я не могу понять, как добраться от массива до Byte [] и обратно.

Массивы могут быть большими, поэтому я бы предпочел решение, которое не включает копирование массива или обработку по одному элементу за раз. Небезопасный код и управляемый или нативный C ++ - это нормально. Я мог бы использовать что-то кроме base64, если это безопасно для XML.

Спасибо за любую помощь или подсказки.

Ответы [ 4 ]

1 голос
/ 20 марта 2009

У вас будут разные варианты, в зависимости от того, какой «Массив» вы используете. Это Array, List <> или ArrayList?

Для List <> вы можете использовать CopyTo(), чтобы захватить части вашего Списка и поместить их в двоичный массив, который затем можно записать с помощью XmlWriter. Чтобы прочитать их обратно из XmlReader, вы можете просто использовать InsertRange для десериализации данных.

Пример чтения:

// elsewhere
List<byte> bytes;

// in the deserialization
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize]; 
int index = 0;
int numRead = -1;

while (numRead != 0) // actually read stuff
{
    numRead = reader.ReadContentAsBase64(buffer,  bufferSize);
    if (numRead > 0)
    {
        bytes.CopyTo(buffer, index, numRead);
        index += numRead;
    }
}

Примечание: приведенный выше код не проверен, но, вероятно, близок. Вы можете сделать нечто подобное, но в обратном порядке, для кодирования и записи данных в base64. Для других типов вам просто нужно преобразовать ваш массив в список байтов.

Чтобы получить другие типы, кроме байтов, в байтовый массив, вам нужно использовать System.BitConverter. У этого есть два метода, которые порадуют вас: GetBytes, который преобразует любой базовый тип данных в байтовый массив, и ToXxx, который включает ToInt32 и ToBoolean. Вы будете нести ответственность за это преобразование самостоятельно после того, как прочитали информацию о base64 или перед тем, как ее записать.

Вы можете использовать BitConverter для преобразования каждого бита в набор байтов, но вы сами должны разработать алгоритм преобразования ваших массивов в массив из одного байта и обратно.

0 голосов
/ 15 июня 2009

Если вы используете XmlSerializer, вы можете указать XmlElementAttribute со свойством DataType, установленным в «base64Binary» в свойстве типа byte []. Смотрите здесь .

0 голосов
/ 24 марта 2009

Краткое описание того, что я в итоге сделал: Для сериализации я использую BinaryWriter для записи отдельных элементов в байтовый массив, обернутый в MemoryStream. Я разбил запись на маленькие кусочки, чтобы массив MemoryStream оставался маленьким. Запишите фрагменты как отдельные элементы XML с текстовым содержимым в кодировке base64.

Десериализация в значительной степени обратная; фрагменты base64 декодируются в байтовый массив; байтовый массив оборачивается потоком памяти и читается BinaryReader для вставки элементов в массив результатов.

0 голосов
/ 21 марта 2009

Если вам нужен один массив, представленный одним элементом XML, содержащим текст Base-64, возможно, самый простой способ - использовать BinaryFormatter для преобразования ваших данных (массив любого числа измерений, Список , что угодно) в байтовый массив, а затем просто закодируйте его в base-64 и вставьте в свой XML-файл. Я не могу придумать какой-либо другой простой способ превратить произвольные массивы в байтовые массивы.

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