【问题标题】:Java Serializable, ObjectInputstream, Non-blocking I/OJava 可序列化、ObjectInputstream、非阻塞 I/O
【发布时间】:2009-09-26 16:58:08
【问题描述】:

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

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

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

【问题讨论】:

  • 也许你可以使用 available() 方法如果流来轮询是否有字节要读取。
  • 错字:那当然应该读作“...of the stream..”

标签: java serialization asynchronous nio


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

这似乎是一件相当奇怪的事情。 NIO 追求的是高性能,而序列化不是。

【讨论】:

  • 我使用 nio 是因为我发现该接口在处理大量流时更易于使用。性能不是主要问题。
【解决方案3】:

这很经典——如果没有什么可读的,你怎么能 .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 ......它深入研究了异常和调度的已知问题,尝试与以这种方式提出问题的人一起工作变得冒险你措辞,尝试重新措辞并让其他人向我解释你在问什么。

我现在要去炸玉米饼摊。

【讨论】:

  • 我认为您没有阅读我的帖子。我正在寻找一种对非阻塞流进行序列化的方法。
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2012-06-18
  • 1970-01-01
相关资源
最近更新 更多