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

时间:2009-09-26 16:58:08

标签: java serialization asynchronous nio

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

有时我甚至会为自己感到惊讶。

答案 1 :(得分:-1)

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

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

答案 2 :(得分:-2)

这是经典的 - 如果没有什么可读的,你怎么能.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()(尽管有“恶意”或不完整的源流,但对于正确初始化反序列化对象很有用)

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

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