Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180

Передача массива байт как поля объекта

01.06.2014, 17:34. Показов 5149. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Есть класс-оболочка БД "Data".
C#
1
2
3
4
5
6
 public class Data
    {
        public string Command
        { get; set; }
        public byte[] Product_Image
        { get; set; }
Для передачи параметров между клиентом и сервером использую xml-сериализацию.
C#
1
2
3
4
5
6
7
8
9
10
11
12
            Data obj = new Data();
            obj.Command = "Insert_Product";
            string fileName = openFileDialog1.FileName;
            if (fileName != "openFileDialog1")
            {
                Image image = Image.FromFile(fileName);
                MemoryStream memoryStream = new MemoryStream();
                image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
                obj.Product_Image = memoryStream.ToArray();
            }
            byte[] msg = Client.Serialize(obj);
            Client.SendMessageReturnData(11000, msg);
Ошибка возникает при десериализации объекта на стороне сервера (не считая исключений вида "16-ное значение 0х00 является недопустимым").
Быть может я некорректно передаю или записываю?
Миниатюры
Передача массива байт как поля объекта  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2014, 17:34
Ответы с готовыми решениями:

Вычесть из одного массива байт другой массив байт
Здравствуйте! Подскажите что нужно сделать чтобы из одного массива байт вычесть другой массив байт!

Передача поля объекта по ссылке
Делаю курсовую через костыли, для плавной анимации сделал функцию, одним из аргументов которой является число, которое увеличивается внутри...

передача массива байт, протокл
Всем привет. Возник вопрос. Есть необходимость передать массив байт в комп от контроллера. Причем в зависимости от запроса передается...

44
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.06.2014, 00:24
Студворк — интернет-сервис помощи студентам
NetFR, вы отсылаете данные, получаете их поврежденными. Нужно разобраться, в чем дело. Сериализованный объект или еще что - это массив байт, какая разница, откуда он получен.
1
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 01:48  [ТС]
Отправляя объект с любыми проинициализированными полями (кроме массива байт) я получаю его цельным и без проблем (bytesSent, bytesRec, размерности и последние байты, xml полностью совпадают).

Добавлено через 5 минут
Попробую сейчас просто строки в массив писать и передавать.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.06.2014, 01:54
NetFR, после XML серилаизации вы получаете просто строку. Инициализированные поля или нет - влияет только на состав строки, на наличие некоторых символов и т.д. Какая разница - передаем строку "hello", "world" или "<root><Element key="why" value="because" /> </root>"?
1
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 02:43  [ТС]
Строку в виде массива передало без проблем. Судя по всему до определенного размера передача выполняется корректно.
Просто я уже понятия не имею в чем может быть проблема. Это жест отчаяния
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0"?>
<Data xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Command>111</Command>
  <Category_Id>1</Category_Id>
  <Category_Name>gfdgdfgfdg</Category_Name>
  <Product_Id>6</Product_Id>
  <Product_Name>gfgdfgdfda</Product_Name>
  <Product_Properties>fsddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffdsfsfdfssdf</Product_Properties>
  <Product_Price>67000</Product_Price>
  <Order_Id>7</Order_Id>
  <Order_User_Id>9</Order_User_Id>
  <Order_Product_Id>9</Order_Product_Id>
  <Order_Name>fdgerwersddfs</Order_Name>
  <Order_Address>gfdgfdgfdg</Order_Address>
  <Order_Phone>gdfgdfdfsfw</Order_Phone>
  <Order_Date_Set>03.06.2014</Order_Date_Set>
  <Order_Date_Get>03.06.2014</Order_Date_Get>
  <Order_Price>16000</Order_Price>
  <Order_Number>9</Order_Number>
  <Order_Count>7</Order_Count>
  <User_Id>9</User_Id>
  <User_Login>sfsdfsdfsd</User_Login>
  <User_Password>gfdgfdgdfgfdg</User_Password>
  <User_Access>9</User_Access>
  <mass>ZHNkc2Zkc2ZzZHNkZnNkZmRzZnNkZg==</mass>
</Data>
Добавлено через 15 минут
Картинки так же передает без проблем, но приближаясь к размеру в 1 кб и более получаем ошибку.

Добавлено через 32 минуты
Хотя чушь спорол. Отправлял я ранее и 200+ кб, а получал порядка 30, так что не в размере дело судя по всему.
0
C#,XNA Game Studio
 Аватар для WhiteMaster
36 / 36 / 8
Регистрация: 26.04.2014
Сообщений: 195
03.06.2014, 08:34
попробуйте http://metanit.com/sharp/tutorial/6.2.php бинарную сериализацию/десериализацию,
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.06.2014, 08:47
NetFR, попробуй другую сериализацию, да, например в JSON. Она поменьше по размеру, да и нагляднее.
1
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 13:40  [ТС]
Я собственно и начинал с обычной бинарки, но, получив множество ошибок вида "Не удалось загрузить сборку" перешел на Xml-сериализацию. Теперь могу уверенно сказать причину той ошибки - данные приходили опять же лишь частично. Попробую сейчас json, но почти уверен в том же результате, проблема-то в передаче, а не сериализации.

Наблюдение: я считываю IP и порт с пользователя. IP я конвертирую как Ip = IPAddress.Parse(string), порт - интовское число.

Добавлено через 5 минут
Так вот, когда я запустил сервер, скажем, по адресу 192.168.100.101 на 11000-м порту, подключение вижу как 192.168.100.101 и рандомный порт, аля подключен клиент 192.168.100.107:5445 и т.д. Это ведь нормально? Какая разница с какого порта пришел запрос на соединение.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
03.06.2014, 13:41
Цитата Сообщение от NetFR Посмотреть сообщение
Это нормально?
Смотря для чего, у FTP, например, тот же принцип, для передачи открывается другое соединение.
1
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 14:50  [ТС]
C#
1
2
3
4
5
6
7
            Class1 obj = new Class1();
            Image image = Image.FromFile(@"D:\122.jpg");
            obj.Image = image;
            var jss = new JavaScriptSerializer();
            string res = jss.Serialize(obj);
            byte[] msg = Encoding.Default.GetBytes(res);
            obj = Client.SendMessageReturnData(msg);
Передаю строку в виде байт, получаю едва ли двадцатую часть.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
03.06.2014, 14:55
Цитата Сообщение от NetFR Посмотреть сообщение
получаю едва ли двадцатую часть.
Уверены, что передача закончилась? TCP передаст всё, так уж он устроен, вот только всё ли Вы примете, да и знаете ли когда передача закончится.
1
C#,XNA Game Studio
 Аватар для WhiteMaster
36 / 36 / 8
Регистрация: 26.04.2014
Сообщений: 195
03.06.2014, 14:58
NetFR, мне кажется вам нужно использоват ьасинхронные методы загрузки с коллбэками в методы где и будут данные сериализованы десериализованы
1
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 15:23  [ТС]
Уверены, что передача закончилась? TCP передаст всё, так уж он устроен, вот только всё ли Вы примете, да и знаете ли когда передача закончится.
Об этом я и думал - вынести в отдельный поток, вызывать рекурсивно в случае продолжения передачи? Отправляет-то клиент, вероятно, полностью, вот только следом сразу же требует ответа от сервера - возможно ли, что он "проскакивает" чтение при большой величине сообщения и уже пытается дать ответ? Может сделать рекурсию на клиенте, скажем, получаем кол-во считанных клиентом байт и, в случае обрыва, передаем данные еще раз с этой позиции? Это, как я понимаю, асинхроная запись-чтение. С рекурсиями я не работал, да и как дозаписывать понятия не имею, поэтому ранее не проверил. Но то, что проблема в чтении-передаче очевидно.
NetFR, мне кажется вам нужно использоват ьасинхронные методы загрузки с коллбэками в методы где и будут данные сериализованы десериализованы
Об этом я и писал выше
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.06.2014, 15:45
NetFR, еще раз, почему бы перед началом передачи не передать интовое значение - сколько байт отсылаем? Ждем 4 байта, когда 4 байта пришло, расшифровываем их, получаем число - длину в байтах, после этого ждем столько байт на входе. Пока не дождемся, не пытаемся ничего делать. Когда получили - расшифровали, получили исходное сообщение. Profit.
1
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 16:24  [ТС]
Psilon, я так и делал. Задавал размерность входящим интовским числом, ожидал передачи. По итогу длины массивов совпадают, вот только получено в разы меньше, нежели отправлено. Или вы имеете в виду добавить условие, пока кол-во полученных байт не совпадет с интовским числом? Можно попробовать.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.06.2014, 16:40
Цитата Сообщение от NetFR Посмотреть сообщение
Или вы имеете в виду добавить условие, пока кол-во полученных байт не совпадет с интовским числом? Можно попробовать.
ну естественно. А то у вас получается "Race condition", то есть что успелось передаться, пока мы формируем строку, то и засунем, а кто не успел, тот опоздал
1
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 17:01  [ТС]
Хахахаха На обычный if плевало.
C#
1
2
3
4
5
6
7
8
9
    Сервер.
                bytesRec = handler.Receive(bytes);
                while(bytesRec != size)
                {
                    byte[] rec = BitConverter.GetBytes(bytesRec);
                    bytesRec = handler.Receive(bytes);
                    Console.WriteLine("Bytes rec: {0}, size: {1}", bytesRec, size);
                    handler.Send(rec);
                }
C#
1
2
3
4
5
6
7
8
     Клиент.
                int rec = BitConverter.ToInt32(data, 0);
                while(rec != bytesSent)
                {
                    sender.Send(msg);
                    sender.Receive(data);
                    rec = BitConverter.ToInt32(data, 0);
                }
Итог: получить данные он все-таки может, но не с первой попытки.
Миниатюры
Передача массива байт как поля объекта  
0
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 17:08  [ТС]
Можно было бы, конечно, так и оставить, но все же Вдруг следующий раз понадобится тысяча попыток? Десять? Сто? Так я до конца времен ждать буду. Кстати, последняя строка означает, что данные успешно десериализовались.
0
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 18:59  [ТС]
Как оказалось, факт успешной передачи еще не означает успешной десериализации. Два абсолютно идентичных xml, вот только длина массива с картиной на стороне сервера равна 0. Никаких ошибок не бьет, просто делает ImageBytes пустым полем. Отличное решение-таки.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        public Image Image
        { get; set; }
 
        public byte[] ImageBytes
        {
            get
            {
                if (Image == null)
                    return new byte[0];
                using (var ms = new MemoryStream())
                {
                    Image.Save(ms, ImageFormat.Png);
                    return ms.GetBuffer();
                }
            }
            set
            {
                if ((Image != null))
                {
                    using (var ms = new MemoryStream(value))
                    {
                        Image = Image.FromStream(ms);
                    }
                }
            }
        }
C#
1
2
3
4
5
6
7
8
9
10
11
            Data obj = new Data();
            string fileName = openFileDialog1.FileName;
            obj.Command = "Add_Product";
            if (fileName != "openFileDialog1")
            {
                obj.Image = Image.FromFile(fileName);
            }
            MessageBox.Show("Length: " + obj.ImageBytes.Length.ToString() + "");
            byte[] msg = Client.Serialize(obj);
            File.WriteAllBytes(@"22.xml", msg);
            Client.SendMessageReturnTable(msg);
C#
1
2
3
4
            case "Add_Product":
                  {
                         File.WriteAllBytes(@"11.xml", bytes);
                  }
На выходе на сервере длина поля ImageBytes = 0. Ниже xml.
Вложения
Тип файла: rar Debug.rar (143.0 Кб, 4 просмотров)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.06.2014, 19:37
NetFR, еще раз, вы неправильно это делаете. не нужно отправлять и получать в цикле. А то прям как из баша
Hsilgos :Ты знаешь про время жизни объекта?
Hsilgos :Так вот...
Hsilgos :Из метода передавался в объект ( который работает в ДРУГОМ потоке ) адресс локальной переменной
Hsilgos :Представляешь, что случается, когда метод выходит?
Hsilgos :Правильно, локальная переменная уничтожается.
Hsilgos :Адресс становится инвалидным
Hsilgos :А так как объект, в который передается этот адрес - работает в другом потоке, то это вполне реальныя маза.
Hsilgos :Я на это втыкаю долго... И иду спрашивать, как это работает?
Hsilgos :Ведь ясно же, что это ошибка.
Hsilgos :На что мне чувак говорит : ставлю у потока более высокий приоритет и благодаря этому объект УСПЕВАЕТ вычитать содержимое переменной
Hsilgos :А ты говоришь - "Архитектура"... "Планирование"...
Hsilgos :Индийцам до нас далеко
Hsilgos :Чисто по-русски. Успеть хапнуть, пока не пришел писец...
1
 Аватар для NetFR
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
03.06.2014, 19:58  [ТС]
Забавно Но как же тогда?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2014, 19:58

Как заставить программу принимать цепочку байт из оперативной памяти, в виде массива байт ?
В памяти процесса есть закодированный блок с байтами, есть адрес этого блока и размер. Есть так-же функция дешифровки этих байт, но она...

Передача массива через write: Передается только 8 байт
Добрый день. Помогите пожалуйста, не понимаю, как передать заполненный двумерный динамический массив через функцию write. Что бы я не писал...

Как, зная Хендл объекта чужого приложения, узнать поля этого объекта?
Как зная Хендл объекта чужого приложения, узнать поля этого объекта?

С++ передача в поле объекта массива
#include &lt;iostream&gt; #include &lt;memory.h&gt; using namesposi std; struct MobMessage{ int msgBoxNum; long address; char data; ...

Передача объекта как аргумент в метод
Метод printClass() предназначен для того, чтобы выводить класс вызвавшего метод объекта и объекта, переданного как аргумент методу. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru