Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> class to byte[] 
V
    Опции темы
pathfinder
Дата 20.5.2010, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну дык в каждом классе и реализовывать метод предложенный COVD-ом
PM MAIL   Вверх
Ak47black
Дата 21.5.2010, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



А что-то пахожее как в C++ в jave нету?
PM MAIL   Вверх
pathfinder
Дата 21.5.2010, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нету. 

В паскале(практически так же как и в C) можно ссылку(указатель) на экземпляр структуры(класса) рассматривать как просто указатель на массив байтов размером со структуру(класс), и на этом оснавании не парится с сериализацией объектов(т.е. представлении их в виде непрерывной последовательности байт). В Java нету указателей(в том смысле что нельзя указатель рассматривать как ссылку на массив байтов), т.е. если есть скажем ссылка на объект object = new SomeObject(...), "размер" которого пусть будет равным 10 байтам, мы не можем написать что типа ((byte[]*)object)[5] и получить шестой байт, как это можно делать в языках поддерживающих указатели, а соответсвенно и прямую работу с памятью. Именно поэтому в Java приходится вручную сериализовывать объект.

Это сообщение отредактировал(а) pathfinder - 21.5.2010, 11:36
PM MAIL   Вверх
Ak47black
Дата 21.5.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



pathfinder, я попробовал запустить Ваш код, но вижу
вот тут
Код

ObjectOutputStream oos = new ObjectOutputStream(os);

Цитата

cannot find symbol
symbol: constructor ObjectOutputStream(test.main.MyOutputStream)


А если делаю что-то похожее 
например
Код

    public static byte[] getBytes(Packet packet){
        ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
        ObjectOutputStream objectStream;
        try{
            objectStream = new ObjectOutputStream(dataStream);
            dataStream.reset();
            objectStream.writeObject(packet);
            objectStream.flush();
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        byte[] datum = dataStream.toByteArray();
        return dataStream.toByteArray();
    }

то при пакете
Цитата

packet.port = 20;
packet.flag = 1;
packet.size = 4;
packet.data = null;

получаю размер данных тут

Код

byte[] datum = dataStream.toByteArray();

Аш 817 байт, что явно нетак.

Добавлено @ 20:06
Сами структуры
Код

public interface Structures
{
    public abstract class Packet
    {
        short size;
    }

    public class TransportPacket extends Packet
    {
        byte port;
        byte flag;
        byte[] data;
    }

}


Добавлено @ 20:08
Возможно-ли с таким подходом получить 4 байта, где
Цитата

packet.port = 1 byte
packet.flag  = 1 byte
packet.size = 2 byte

?

Это сообщение отредактировал(а) Ak47black - 21.5.2010, 20:09
PM MAIL   Вверх
pathfinder
Дата 21.5.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Для MyOutputStream забыл указать что он реализует интерфейс OutputStream )

По поводу размера - при сериализации средствами ObjectOutputStream(да и любыми другими) в массив добовляются дополнительные данные, что-бы можно было произвести десериализацию(магический заголовок, размер, наименование класса и тп), конкретно какие именно дополнительные данные добовляются надо смотреть в спецификации(тока она от версии к версии JVM может менятся).



PM MAIL   Вверх
Ak47black
Дата 21.5.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



pathfinder, 
ну в принципе понятно тогда.
Вроде теперь понимаю, что тема "мутная". Ну незнаю, думаю тогда врятли у меня получится сделать так удачно как это можно сделать в C/C+....  smile 
PM MAIL   Вверх
pathfinder
Дата 21.5.2010, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если пропускная способность канал вещь не критичная то использование ObjectOutputStream/ObjectInputStream оправдано и достаточно просто. Протокол вообще пишется на 1-2-3. 

Как пример.
Код


public class QueryList {

    public static final int LOGIN_QUERY = 1;

}

public class CommonQuery implements Serializable {

    public int queryID; 
    
    protected CommonQuery(int queryID) {
        this.queryID = queryID;
    }

}

public class LoginQuery extends CommonQuery {

    public String user;
    public String password;
    
    public LoginQuery(String user, String password) {
        super(QueryList.LOGIN_QUERY);
        this.user = user;
        this.password = password;
    }

}

/* *** НА СТОРОНЕ КЛИЕНТА ******************************************* */
// инициализируются при подключении к серверу  ...
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

// выполнение запроса к серверу
oos.writeObject(new LoginQuery(...));
CommonResult result = (CommonResult) ois.readObject();
if (result.queryID == QueryList.LOGIN_QUERY) {
    // обработка результата
} else {
    // ошибка протокола, запрос был Login, а релультат левый какой-то
}

/* *** НА СТОРОНЕ СЕРВЕРА ******************************************* */
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

try {
    CommonQuery query = (CommonQuery) ois.readObject();
    switch (query.queryID) {
        case QueryList.LOGIN:
            LoginQuery loginQuery = (LoginQuery) query;
            // обрабатываем логин, формируем результат
            oos.writeObject( /* результат */ );
            break;
    }
} catch (Exception ex) {
    // обработка 
}

PM MAIL   Вверх
Ak47black
Дата 21.5.2010, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Эмм... я только просто немного нето пищу.
А так в принципе я узнал то что хотел.
pathfinder, Спасибо Вам за помощь.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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