Java Serializable,ObjectInputstream,非阻塞I / O.

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

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

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

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

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

有时我甚至会惊讶自己。

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

尝试这样做似乎有点奇怪。 NIO是关于高性能的,而序列化则不是。

这是经典的 – 如果没有什么可读的,你怎么能.read()? NIO显然是性能密集型的,致力于实现非阻塞io。 尝试在Socket.read()上执行nio – 你仍然会得到一个阻塞操作或者在超时时掉头……除非你生成一些数据,否则没有多少花哨会导致数据出现在’port’上……

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

我的一次性伪代码有望提供某种数据流来解码,重载或其他任何东西 – 我重新阅读你的post; 我认为它说如何在一个可能不存在的对象上读取()非阻塞io …深入研究Exception和调度的已知问题,试图与那些以问题方式询问问题的人一起工作你措辞,尝试重新措辞,并让别人向我解释你在问什么。

我此刻要去墨西哥卷饼摊。