如何在java中将对象序列化为非阻塞套接字

如何在java中将对象序列化为非阻塞套接字,java,asynchronous,io,nio,Java,Asynchronous,Io,Nio,我一直在阅读JavaNIO和非阻塞套接字,我想将序列化对象写入套接字。我在这里读过这篇文章,它说如果你把非阻塞套接字包在PrintWriter上,它就会阻塞。我想知道如果我将socket.getOutputStream包装在ObjectOutputStream上是否也一样?有没有简单的方法来测试包装器是否阻塞?我在PrintWriter或ObjectOutputStream文档中找不到这方面的任何提及 下面是上述文章的代码片段: else if ( key.isWritable() ) {

我一直在阅读JavaNIO和非阻塞套接字,我想将序列化对象写入套接字。我在这里读过这篇文章,它说如果你把非阻塞套接字包在PrintWriter上,它就会阻塞。我想知道如果我将socket.getOutputStream包装在ObjectOutputStream上是否也一样?有没有简单的方法来测试包装器是否阻塞?我在PrintWriter或ObjectOutputStream文档中找不到这方面的任何提及

下面是上述文章的代码片段:

else if ( key.isWritable() ) {

    Socket socket = (Socket) key.attachment();

    PrintWriter out = new PrintWriter( socket.getOutputStream(), true );

    out.println( "What is your name? " );
}

不确定您是否错过了它,但本文明确指出,使用的任何传统I/O实用程序都不会插入并显示用于从异步通道读写文本的示例代码。以下是相关摘录:

此代码的问题是 PrintWriter会阻止I/O,但不会 支持底层异步 I/O机制。处理这个问题 问题是,我们不能使用任何 标准I/O实用程序,但是 我们必须把我们的信息用便笺纸包起来 对象并通过 SocketChannel对象

那代码在你的情况下不起作用吗

你说:

我正在想办法 将对象转换为字节[]。 字符串具有getBytes()方法。我 我不确定什么是通用的 可序列化对象。我一直在使用 ObjectOutput/InputStream类,但 根据文章,如果我使用 他们,它将再次阻塞。我是吗 正确理解这一点

你是对的;使用
ObjectInputStream
/
ObjectOutputStream
包装I/O流将再次导致阻塞。这里的解决方案可能是将
ByteArrayOutputStream
包装在
ObjectOutputStream
中,并将对象写入底层字节数组。这个底层字节流/数组现在具有对象的字节表示(显然遵循Java序列化规范)。从那以后,NIO的事情就再正常不过了。如果你感兴趣的话,这里有一些很好的讨论,与我正在谈论的事情相关

编辑:另外,我同意文章作者的观点,NIO很难做到正确。作者推荐ApacheMina,但我想添加另一个推荐,“JBossNetty”。Netty的作者经常出没,这样你就可以回答你的问题


我还想指出,如果您的动机是跨Java对象发送数据,那么请使用一个针对这些需求进行调优的框架,即Java RMI或JBoss远程处理。比处理对象流等要容易得多。

我完全错过了那条评论。但是,是的,我正在尝试找出如何将一个对象转换为一个字节[]。字符串具有getBytes()方法。我不确定一般可序列化对象使用什么。我一直在使用ObjectOutput/InputStream类,但根据文章,如果我使用它们,它将再次阻塞。我理解正确吗?