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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Object -> byteStream, как из Serialized объекта получить набор 
V
    Опции темы
COVD
Дата 11.10.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

ну так мы эго с начала в буфер положим 


Правильно. Просто и надежно, но тогда появляется операция копирования данных.  А можно обойтись одним буфером и применять compact().

Цитата

Очн жаль что не получиться экономить 


Это ваш выбор, что предпочесть - скорость или соответствие стандартам.
PM MAIL   Вверх
LSD
Дата 11.10.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(KOp4iK @  11.10.2006,  12:11 Найти цитируемый пост)
Очн жаль что не получиться экономить

В принципе, можно написать генератор классов, который бы реализовывал оптимальное сохранение. И по памяти и по скорости. Но это потребует некоторых усилий.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
KOp4iK
Дата 16.10.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо буду пользоваться стандартом
PM MAIL   Вверх
AlexKozlov
Дата 11.11.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Столкнулся  с такой же задачей. Вот что у меня вышло.

Стандартные ObjectInputStream ObjectOutputStream подменяю на свои ObjectWriter, ObjectReader
первый отправляя объект добавляет в поток перед ним 4 байта 
второй получает данные в виде порций байтов (через метод push) отлавливает длину, если данных достаточно, то подсовывает их в ObjectInputStream и увеличивает счетчик готовых к приему объектов. Читать можно в двух режимах - неблокирующем, если мы заталкивали данные через push и в блокирующем - если мы подцепили к нему InputStream. Это сделано потому что на сервере я делаю поллинг, а на клиенте работаю с обычным сокетом.

Код

package lib;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.nio.ByteBuffer;

public class ObjectWriter {
    OutputStream os;
    PipedInputStream pis=new PipedInputStream();
    PipedOutputStream pos=new PipedOutputStream();
    ObjectOutputStream oos;
    
    public ObjectWriter(OutputStream os1) {
        os=os1;
        try {
            pis.connect(pos);
            oos=new ObjectOutputStream(pos);
        } catch (IOException e) { e.printStackTrace(); }
    }
    
    byte[] buffer;
    ByteBuffer buf;
    public void writeObject(Object obj) {
        try {
            oos.writeObject(obj);
            int len=pis.available();
            buf=ByteBuffer.allocate(4);
            buf.putInt(len);
            buf.rewind();
            os.write(buf.array());
            if ((buffer==null)||(buffer.length<len))
                buffer=new byte[len];
            pis.read(buffer);
            os.write(buffer, 0, len);
            os.flush();
        } catch (IOException e) { e.printStackTrace(); }
    }
    
    public void close() {
        try { oos.close(); } catch (IOException e) { e.printStackTrace(); }
        try { os.close(); } catch (IOException e) { e.printStackTrace(); }
        try { pis.close(); } catch (IOException e) { e.printStackTrace(); }
        try { pos.close(); } catch (IOException e) { e.printStackTrace(); }
    }
    
    public void flush() {}
}



Код

package lib;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.nio.ByteBuffer;

public class ObjectReader {
    public int ready;
    boolean start;
    int len;
    
    PipedInputStream pis=new PipedInputStream();
    PipedOutputStream pos=new PipedOutputStream();
    ObjectInputStream ois;
    InputStream is;

    public ObjectReader(){
        try {
            pis.connect(pos);
        } catch (IOException e) { e.printStackTrace(); }
        start=true;
    }

    public ObjectReader(InputStream is1){
        this();
        is=is1;
    }
    
    public void push(ByteBuffer buf) {
        int len=buf.position();
        byte[] b=buf.array();
        push(b,len);
    }
    
    ByteBuffer bb;
    public void push(byte[] buf,int l) {
        if (bb==null) { 
            bb=ByteBuffer.allocate(l);
        } else    if (bb.remaining()<l) {
            ByteBuffer temp=bb;
            bb=ByteBuffer.allocate(Math.max(bb.capacity()+l,bb.capacity()*2)); // Увеличиваем буфер
            if (temp.position()>0) 
                bb.put(temp.array(),0,temp.position());
        }  
        bb.put(buf,0,l);        
        process();
    }

    void process(){
        if (bb.position()<4) return;
        if (start&&(bb.position()>=4)) {
            start=false;
            len=bb.getInt(0);
        }
        if ((!start)&&(bb.position()>=4+len)) {
            pushObject();
            process(); // смотрим - нет ли еще объктов
        }        
    }
        
    void pushObject(){
        try {
            pos.write(bb.array(),4,len);
            ready+=1;
            start=true;
            int p=bb.position()-4-len;
            bb.position(4+len);
            bb.compact();
            bb.position(p);
        } catch (IOException e) { e.printStackTrace(); }        
    }
        
    byte[] ibuf=new byte[1024];
    public Object readObject() {
        if (is!=null) {//Традиционный способ - с блокировкой
            while (ready<1) {
                try {
                    int len=is.read(ibuf);
                    push(ibuf,len);                    
                } catch (IOException e) { e.printStackTrace(); }
            }
        }
        
        if (ready>0)
            try {
                ready--;
                if (ois==null) ois=new ObjectInputStream(pis);
                return ois.readObject();
            } catch (Exception e) {    e.printStackTrace(); }
        return null;
    }

}


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

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

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


 




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


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

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