![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Здравствуйте.
Вот такая ситуация есть класс
ищу функцию, которая-бы переводила-бы переменную структуры в byte[]. Как лучше сделать? Другими словами делаю модель сетевых протоколов и мне нужно сначала заполнить структуру TransportPacket, а потом получить byte[] из этой структуры что-бы передать нижнему уровню. |
|||
|
||||
| dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 11 Всего: 16 |
hessian – удобный бинарный протокол. рекомендую. http://hessian.caucho.com/
|
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Не я смысле сам пишу модель
Добавлено через 58 секунд Мне просто надо найти функцию на которую я подаю структуру [+ размер] и получаю byte[]. Добавлено через 4 минуты и 13 секунд Хотя в принципе я могу сам это всё дело написать. Я просто хотел-бы узнать что уже есть стандартное. |
|||
|
||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Стандартно для этого применяются ObjectOutputStream(Object -> byte[]) и ObjectInputStream(byte[] -> Object)
Только объекты обязательно должны быть помечены как сериализуемые, для этого достаточно указать, что класс реализует интерфейс Serializable. Единственное что останется сделать - это реализовать OutputStream и InputStream. Т.е. Object -> byte[] будет выглядеть так
Это сообщение отредактировал(а) pathfinder - 20.5.2010, 21:25 |
|||
|
||||
| Ak47black |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
А вот так как-то получится у меня сделать?
И сама функция
При выполнении вот тут
получаю
Функцию вызываю с
Добавлено через 4 минуты и 27 секунд По идее
Это сообщение отредактировал(а) Ak47black - 20.5.2010, 21:40 |
||||||||||||
|
|||||||||||||
| pathfinder |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Все решение задачи заключается в реализации OutputStream, например вот так
пользоваться этим вот так
Это сообщение отредактировал(а) pathfinder - 20.5.2010, 22:10 |
||||
|
|||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Ну я хотел-бы всётаки сделать с моим кодом что-то.
Ведь по идее он почти рабочий. (так со стандартным я теперь вижу что труднее) Это сообщение отредактировал(а) Ak47black - 20.5.2010, 22:09 |
|||
|
||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
В Java нельзя ссылку на объект интерпритировать как указатель на область памяти. System.arraycopy нельзя рассматривать как аналог функции memcopy.
Через ObjectOutputStream удобнее сразу же писать Socket. |
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Не ну тут наверно как-то всеравно можно без ObjectOutputStream обойтись. Мне же только всеволищь нужно получить byte[]
|
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Это сообщение отредактировал(а) COVD - 20.5.2010, 22:38 |
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Не у Вас не универсальная функция
Я просто будут делать классы для пакетов имеющие разные переменные, но все наследующие класс Packet который имеет поле size. |
|||
|
||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
ObjectOutputStream это стандартный способ.
|
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
+
Хорошо, а кто-нибудь может ещё как-то подправить мой код что-бы он работал? |
|||
|
||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Извиняюсь вопрос не понял. Способ COVD-а классный.
|
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Там реализация для конкретно взятого класса, а мне нужно сделать функцию, которую можно было-бы применить для почти любого класса который наследуется от класса Packet.
Это сообщение отредактировал(а) Ak47black - 20.5.2010, 22:55 |
|||
|
||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Ну дык в каждом классе и реализовывать метод предложенный COVD-ом
|
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
А что-то пахожее как в C++ в jave нету?
|
|||
|
||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Нету.
В паскале(практически так же как и в C) можно ссылку(указатель) на экземпляр структуры(класса) рассматривать как просто указатель на массив байтов размером со структуру(класс), и на этом оснавании не парится с сериализацией объектов(т.е. представлении их в виде непрерывной последовательности байт). В Java нету указателей(в том смысле что нельзя указатель рассматривать как ссылку на массив байтов), т.е. если есть скажем ссылка на объект object = new SomeObject(...), "размер" которого пусть будет равным 10 байтам, мы не можем написать что типа ((byte[]*)object)[5] и получить шестой байт, как это можно делать в языках поддерживающих указатели, а соответсвенно и прямую работу с памятью. Именно поэтому в Java приходится вручную сериализовывать объект. Это сообщение отредактировал(а) pathfinder - 21.5.2010, 11:36 |
|||
|
||||
| Ak47black |
|
||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
pathfinder, я попробовал запустить Ваш код, но вижу
вот тут
А если делаю что-то похожее например
то при пакете
получаю размер данных тут
Аш 817 байт, что явно нетак. Добавлено @ 20:06 Сами структуры
Добавлено @ 20:08 Возможно-ли с таким подходом получить 4 байта, где
? Это сообщение отредактировал(а) Ak47black - 21.5.2010, 20:09 |
||||||||||||||
|
|||||||||||||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Для MyOutputStream забыл указать что он реализует интерфейс OutputStream )
По поводу размера - при сериализации средствами ObjectOutputStream(да и любыми другими) в массив добовляются дополнительные данные, что-бы можно было произвести десериализацию(магический заголовок, размер, наименование класса и тп), конкретно какие именно дополнительные данные добовляются надо смотреть в спецификации(тока она от версии к версии JVM может менятся). |
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
pathfinder,
ну в принципе понятно тогда. Вроде теперь понимаю, что тема "мутная". Ну незнаю, думаю тогда врятли у меня получится сделать так удачно как это можно сделать в C/C+.... |
|||
|
||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Если пропускная способность канал вещь не критичная то использование ObjectOutputStream/ObjectInputStream оправдано и достаточно просто. Протокол вообще пишется на 1-2-3.
Как пример.
|
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Эмм... я только просто немного нето пищу.
А так в принципе я узнал то что хотел. pathfinder, Спасибо Вам за помощь. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |