Я получаю прерывистое исключение «нехватка памяти» в этом операторе:
return ms.ToArray();
В этом методе:
public static byte[] Serialize(Object inst)
{
Type t = inst.GetType();
DataContractSerializer dcs = new DataContractSerializer(t);
MemoryStream ms = new MemoryStream();
dcs.WriteObject(ms, inst);
return ms.ToArray();
}
Как я могу предотвратить это? Есть ли лучший способ сделать это?
Длина ms составляет 182 870 206 байт (174,4 МБ)
Я помещаю это в байтовый массив, чтобы потом можно было запустить его через сжатие и сохранить на диске. Эти данные (очевидно) представляют собой большой список пользовательских классов, которые я загружаю с сервера WCF при запуске приложения Silverlight. Я сериализую его и сжимаю, чтобы он использовал только около 6 МБ в изолированном хранилище. В следующий раз, когда пользователь посещает и запускает приложение silverlight из Интернета, я проверяю метку времени, и если это хорошо, я просто открываю файл из изолированного файла, распаковываю его, десериализую его и загружаю свою структуру. Я храню всю структуру в памяти, потому что приложение в основном ориентировано на манипулирование содержимым этой структуры.
@ Конфигуратор правильный. Размер массива был слишком велик. Я прокрутил собственный сериализатор, объявив байтовый массив [количество записей в списке * число байтов на запись], а затем сам наполнил его, используя такие выражения, как это:
Buffer.BlockCopy(
BitConverter.GetBytes(node.myInt),0,destinationArray,offset,sizeof(int));
offset += sizeof(int);
и это, чтобы получить его обратно:
newNode.myInt= BitConverter.ToInt32(sourceByteArray,offset);
offset += sizeof(int);
Затем я сжал его и сохранил в изолированном хранилище.
Мой размер увеличился с 174 МБ с DataContractSerializer до 14 МБ с моим.
После сжатия он перешел с 6 МБ до 1 МБ файла в изолированном хранилище.
Спасибо Конфигуратору и Филипу за помощь.