Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размер буфера при сериализации, Можно ли не задавать его размер явно 
:(
    Опции темы
Competitor
Дата 8.6.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: -1
Всего: -1



Привет Всем!
Сериализую объект класса в массив байт:
Код

            byte[] buffer = new byte[4096];
            using (MemoryStream memStream = new MemoryStream(buffer))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(memStream, classObject);
            }


Но после сериализации в буфере скорее всего будет занято куда меньше места, чем я для него выделил. Нехорошо. Плюс не исключена (хотя и маловероятна) ситуация когда 4096 байт не хватит для того, чтобы разместить в таком массиве сложный объект.
Вопрос: есть ли способ не задавать явно размер буфера? 
PM MAIL WWW   Вверх
HalkaR
Дата 8.6.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 14
Всего: 42



Competitor, естественно если размер обьекта меньще 4K то будет занято меньше.
Если же будет больше, то будет увеличен размер буфера еще на 4К. Такая уж система увеличения буфера по 4К.
PM MAIL   Вверх
Competitor
Дата 8.6.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: -1
Всего: -1



HalkaR, ok, перефразирую.
Как решить задачу сериализации объекта в массив байт, чтобы на выходе получился массив именно того размера, который требуется для данного объекта?
Очевидно, что в приведенном мной примере условие этой задачи не выполняются по уже описанным выше причинам.
PM MAIL WWW   Вверх
Azzdorf
  Дата 8.6.2007, 16:19 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



а ты не пробовал просто проводить сериализацию без выделения памяти, Сшарп сам выделит сколько будет нужно
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
Competitor
Дата 8.6.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: -1
Всего: -1



Azzdorf, конечно пробовал. Выдает ошибку: buffer не может быть нулевым.
PM MAIL WWW   Вверх
tol05
Дата 8.6.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата

MemoryStream()
Инициализирует новый экземпляр класса MemoryStream с помощью расширяемой емкости, инициализированной с нулевым значением.


я так понимаю, тебе при серилизации массив конкретного размера не нужен?

Код

using(MemoryStream memStream = new MemoryStream())
{
   BinaryFormatter formatter = new BinaryFormatter();
   formatter.Serialize(memStream, classObject);
}


Это не из той темы, что мы когда-то обсуждали? smile Я забыл детали уже, так что если что - не бей ногами smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Competitor
Дата 8.6.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: -1
Всего: -1



пять баллов, tol05 smile
Код

            byte[] buffer = null;
            using (MemoryStream memStream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(memStream, employee777);
                buffer = new byte[memStream.Length];
                memStream.Position = 0;
                memStream.Read(buffer, 0, buffer.Length);
            }


ЗЫ: Когда же я наконец научусь сам пользовать гуглем и мсдном :(
PM MAIL WWW   Вверх
Competitor
Дата 8.6.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: -1
Всего: -1



А как обыграть ситуацию, когда идет чтение из NetworkStream? Т.е. смысл тот же, после чтения из потока получить массив точно такого же размера, который необходим:
Код

                    this.networkStream = new NetworkStream(this.socket);
                    .....
                    byte[] buffer = new byte[4096];
                    int readBytes = this.networkStream.Read(buffer, 0, buffer.Length);

Здесь мы вынуждены предварительно определить размер массива, хотя занято в итоге будет меньше байт. Как после чтения данных через сокет получить массив размера readBytes?
PM MAIL WWW   Вверх
tol05
Дата 8.6.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата

NetworkStream.Length Property 
Gets the length of the data available on the stream. This property is not currently supported and always throws a NotSupportedException. 


Э, тут никак, по-моему. Для сетевых потоков (и для MemoryStream) нельзя узнать кол-во данных, пока не прочтешь. Сделано это для уменьшения траффика типа smile
тут

только так: задаешь массив конкретного размера, читаешь в него, пересохраняешь куда-нибудь данные, читаешь снова и так, пока не закончатся данные для чтения. Смотришь перед каждым чтением свойство this.networkStream.DataAvailable когда данных не будет, берешь последнее значение своего readBytes и 
Код

int totalBytes = readBytes + CountOfReads*buffer.Length

 smile 

P.S. Можно сохранять все полученные данные опять же в MemoryStream, а потом из него получить массив всех полученных данных

Это сообщение отредактировал(а) tol05 - 8.6.2007, 18:42


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0490 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.