我刚刚开始使用 Java 序列化,我不清楚在具有非阻塞 I/O 的场景中应该如何从源获取对象。
我能找到的所有文档都建议使用 ObjectInputStream 是读取序列化对象的正确方法。但是,正如我提到的,我正在使用 java.nio 并执行非阻塞操作。如果 readObject() 将阻塞直到有新对象可用,这对我没有帮助
总结 .. 使用 Java NIO 时如何进行序列化?
我刚刚开始使用 Java 序列化,我不清楚在具有非阻塞 I/O 的场景中应该如何从源获取对象。
我能找到的所有文档都建议使用 ObjectInputStream 是读取序列化对象的正确方法。但是,正如我提到的,我正在使用 java.nio 并执行非阻塞操作。如果 readObject() 将阻塞直到有新对象可用,这对我没有帮助
总结 .. 使用 Java NIO 时如何进行序列化?
将序列化的实例包装在报告有效负载长度的协议中,有效负载就是相关实例。然后,一旦您知道您有一个代表完整实例的段,您就可以安全地使用 ObjectInputStream,因为它不会阻塞。
像这样的协议 前 32 位:有效负载长度 有效负载长度位:序列化数据
有时连我自己都感到惊讶。
您将需要实现(或找到一个实现)InputStream
从缓冲区中读取的,您可以从另一个线程附加到该缓冲区。
尝试这样做似乎确实是一件相当奇怪的事情。NIO 是关于高性能的,而序列化不是。
这是经典的——如果没有什么可读的,你怎么能 .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 ......它深入研究了异常和调度的已知问题,尝试与以这种方式提出问题的人一起工作变得冒险你措辞,尝试重新措辞并让其他人向我解释你在问什么。
我现在要去炸玉米饼摊。