7

我刚刚开始使用 Java 序列化,我不清楚在具有非阻塞 I/O 的场景中应该如何从源获取对象。

我能找到的所有文档都建议使用 ObjectInputStream 是读取序列化对象的正确方法。但是,正如我提到的,我正在使用 java.nio 并执行非阻塞操作。如果 readObject() 将阻塞直到有新对象可用,这对我没有帮助

总结 .. 使用 Java NIO 时如何进行序列化?

4

3 回答 3

4

将序列化的实例包装在报告有效负载长度的协议中,有效负载就是相关实例。然后,一旦您知道您有一个代表完整实例的段,您就可以安全地使用 ObjectInputStream,因为它不会阻塞。

像这样的协议 前 32 位:有效负载长度 有效负载长度位:序列化数据

有时连我自己都感到惊讶。

于 2009-09-26T21:42:59.733 回答
-1

您将需要实现(或找到一个实现)InputStream从缓冲区中读取的,您可以从另一个线程附加到该缓冲区。

尝试这样做似乎确实是一件相当奇怪的事情。NIO 是关于高性能的,而序列化不是。

于 2009-09-26T17:24:36.010 回答
-2

这是经典的——如果没有什么可读的,你怎么能 .read() 呢?NIO 显然是性能密集型的,致力于实现非阻塞 io。尝试在 Socket.read() 上执行 nio - 您仍然会获得阻塞操作或超时失败...除非您生成一些数据,否则任何花哨都不会导致数据出现在“端口”上...

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() 的一万二千行(尽管“敌对”或不完整的源流对正确初始化反序列化对象很有用)

我的一次性伪代码预计会提供某种数据流来解码、重新加载或其他任何东西——我重新阅读了你的帖子;我认为它说明了如何在可能不存在的对象上读取()非阻塞 io ......它深入研究了异常和调度的已知问题,尝试与以这种方式提出问题的人一起工作变得冒险你措辞,尝试重新措辞并让其他人向我解释你在问什么。

我现在要去炸玉米饼摊。

于 2009-09-26T18:44:46.193 回答