我刚刚开始使用Java序列化,而且我不清楚如何在具有非阻塞I / O的场景中从源中获取对象。
我能找到的所有文档建议使用ObjectInputStream是正确的方式来读取序列化对象。但是,正如我所提到的,我正在使用java.nio并执行非阻塞操作。如果readObject()将阻塞,直到有新对象可用,这对我无法帮助
总结..在使用Java NIO时如何进行序列化?
答案 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和调度的已知问题,试图与那些以问题方式询问问题的人一起工作你措辞了,尝试重新措辞,并让别人向我解释你在问什么。
此刻我要去墨西哥卷饼店。