Сериализуемая Java, ObjectInputstream, неблокирующий ввод-вывод
Я только начинаю с сериализации Java, и я не понимаю, как вы должны получать объекты из источника в сценарии с неблокирующим вводом-выводом .
вся документация, которую я могу найти, предлагает использовать ObjectInputStream-это правильный способ чтения в сериализованных объектах. Однако, как я уже упоминал, я использую java.nio и выполнение неблокирующих операций. Если readObject () будет блокировать, пока новый объект не будет доступен, это не поможет мне
резюме .. Как вы делаете сериализацию при работе с Java NIO?
3 ответов
оберните сериализованные экземпляры в протокол, который сообщает длину полезной нагрузки, и полезная нагрузка-это экземпляр, о котором идет речь. Затем, как только вы знаете, что у вас есть сегмент, представляющий полный экземпляр, вы можете безопасно использовать ObjectInputStream, зная, что он не будет блокировать.
протокол такой Первые 32 бита: длина полезной нагрузки Биты длины полезной нагрузки: сериализованные данные
иногда я сам себе удивляюсь.
вам нужно будет реализовать (или найти реализацию)InputStream
который считывает из буфера, который вы можете добавить из другого потока.
это кажется довольно странной вещью, чтобы попытаться сделать. NIO-это высокая производительность, а сериализация-нет.
Это классика - как можно .read () если нечего читать? NIO явно интенсивная производительность, посвященная достижению неблокирующего ввода-вывода. Попробуйте сделать nio на сокете.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 на объекте, который может не быть там ... который углубляется в известные проблемы исключения и планирования, становится рискованным, пытаясь работать с кем-то, кто задает вопрос так, как вы его сформулировали, попробуйте переформулировать и заставить других объяснить мне, что вы спрашиваете.
Я собираюсь пойти к стойке тако прямо сейчас.