2009-09-26 2 views
7

Я только начинаю с сериализации Java, и я не понимаю, как вы должны получать объекты из источника в сценарии с неблокирующими ввода/O.Java Serializable, ObjectInputstream, Non-blocking I/O

Вся документация, которую я могу найти, предполагает использование ObjectInputStream - это правильный способ чтения в сериализованных объектах . Однако, как я уже говорил, я использую java.nio и выполняю неблокирующие операции. Если readObject() будет блокироваться до тех пор, пока не будет доступен новый объект, это не поможет мне

Резюме .. Как вы выполняете сериализацию при работе с Java NIO?

+0

Возможно, вы можете использовать метод available(), если поток для опроса, если есть байты для чтения. – clamp

+0

typo: это, конечно, должно читать «... потока ...» – clamp

ответ

4

Оберните сериализованные экземпляры в протокол, который сообщает длину полезной нагрузки, а полезная нагрузка - соответствующий экземпляр. Затем, как только вы узнаете, что у вас есть сегмент, представляющий полный экземпляр, вы можете использовать ObjectInputStream безопасно, зная, что он не будет блокироваться.

Протокол как этого Первые 32 бита: длина Payload Payload длина бита: Последовательные данные

Иногда поражают даже сам.

+0

Теперь я знаю, почему строки fortran начинаются с размера строки, а затем content.http: //www.ibiblio.org/pub/languages/fortran/ch2-13.html – whatnick

-1

Вам необходимо реализовать (или найти реализацию) InputStream, который читает из буфера, который вы можете добавить из другого потока.

Это действительно странно, что вы пытаетесь сделать. NIO все о высокой производительности, а сериализация - нет.

+0

Я использую nio, потому что с интерфейсом, с которым я работал, с ним было проще работать, имея дело с большим количеством потоков. Производительность не является первоочередной задачей. – Mike

-2

Это классика - как вы можете .read(), если читать нечего? NIO явно интенсивно работает, ориентируясь на достижение неблокирующего io. Попробуйте сделать nio на Socket.read() - вы все равно получите либо операцию блокировки, либо провалитесь по тайм-ауту ... никакое количество фантазий не приведет к появлению данных на «порту», ​​если вы не сгенерируете некоторые данные ...

final SecureRandom dataGenerator = SecureRandom.getInstance("SHA1PRNG"); 

final Integer range = new Integer('z' - 'a'); 

for (big loop) 
{ 
    buffer.append(dataGenerator.nextInt (range.intValue() + (int) 'a')); 

// ............ 

do.something(buffer.toString()); 

Теперь ваши навыки развития двигаются, даже если у ледникового периода, но они двигаются.

try { 
    // Create a read/writeable file channel 
    File file = new File("filename"); 
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); 

    // Create an output stream on the channel 
    OutputStream os = Channels.newOutputStream(channel); 

    // Create an inputstream on the channel 
    InputStream is = Channels.newInputStream(channel); 

    // Close the channel 
    is.close(); 
} catch (IOException e) { 
} 

редактировать сообщения: я осознаю свой критический ответ, ждать, пока ваши двенадцать тысяч строк в CORBA пытается реализовать readObjectNoData() (полезно для инициализации десериализованных объектов правильно, несмотря на «враждебный» или неполный поток источника)

Предполагалось, что мой разовый psuedo-код обеспечит некоторый поток данных для декодирования, перезагрузки или что-то еще - я перечитаю ваше сообщение; Я думаю, что он говорит, как читать(), не блокируя io, на объекте, который, возможно, не существует ... который глубоко укореняется в известных проблемах Исключения и планирования, становится очень похожим на попытку работать с кем-то, кто задает вопрос таким образом вы сформулировали это, попробуйте переформулировать и попросите других объяснить мне, что именно вы спрашиваете.

Я собираюсь пойти на стенд taco прямо сейчас.

+0

Я не думаю, что вы читали мое сообщение. Я ищу способ сделать сериализацию в неблокирующем потоке. – Mike