我正在尝试通过频道发送序列化对象。我们的想法是使用方法构造函数扩展SocketChannel
,以保存要发送的Object,并添加方法
writeObj()
为了发送序列化对象大小,后跟序列化对象。
使用私有字段,我正在尝试以非阻塞模式管理所有过程,因此使用ByteBuffer src
将构造函数保存对象序列化为writeObj()
字段和super.write(ByteBuffer src)
写入对象。 (如果未完全接收到Object,则返回null的Object readObj()
;如果super.read()
返回-1,则返回Object)
问题是SocketChannel是抽象类,因此不允许使用super.read()
和super.write(..)
。
我应该延长SocketChannelImpl
还是有其他正确的方法来执行此操作?
答案 0 :(得分:2)
经典XY问题。
扩展SocketChannel
你不能。
添加自定义读写
你不能。
我试图通过频道发送序列化对象。我们的想法是使用保存Object的方法构造函数扩展SocketChannel,并添加方法writeObj()以发送序列化对象大小,后跟序列化对象。
你不能。你不需要。您可以将任何Serializable
对象序列化为ByteArrayOutputStream
,获取其字节,并通过您用于发送任何其他字节的相同技术发送这些字节。
使用私有字段,我试图以非阻塞模式管理所有过程,所以构造函数将对象序列化为ByteBuffer src字段,使用super.write(ByteBuffer src)将writeObj()写入对象。 / p>
我不明白使用私人领域'考虑到你在实践中不能首先扩展SocketChannel
:我也不明白为什么私人领域是必要的,或者为什么你会这么想。< / p>
(各个Object readObj()如果没有完全接收到Object,则返回null;如果是,则返回Object super.read()返回-1)
这已经是两个主要的设计错误。如果对象未被完全接收,则应继续接收,如果在完全接收对象之前发生EOS,则应抛出异常而不是返回任何内容。
问题是SocketChannel是抽象类,所以不允许使用super.read()和super.write(..)。
问题在于:(a)您的设计方法和(b)您的设计细节都(c)存在根本缺陷,(d)完全没有必要。除了在非阻塞模式下接收任何应用协议消息所需的代码之外,您不需要任何额外的代码。这很复杂,因为你必须处理接收器的部分读取和流的过早结束,以及发送者的部分写入,但它不需要扩展SocketChannel
或其他措施你提到。
我应该扩展SocketChannelImpl
没有
还是有其他正确的方法可以做到这一点?
这里有很多关于如何处理这两种情况的帖子。