Классическая задача XY.
Расширить SocketChannel
Вы не можете.
чтобы добавить пользовательское чтение и запись
Вы не можете.
Я пытаюсь отправить сериализованный объект по каналам. Идея состоит в том, чтобы расширить SocketChannel конструктором метода, который сохраняет объект для отправки, и добавить метод writeObj() для отправки размера сериализованного объекта, за которым следует сериализованный объект.
Вы не можете. Вам не нужно. Вы можете сериализовать любой объект Serializable
в ByteArrayOutputStream
, получить его байты и отправить эти байты с помощью тех же методов, которые вы использовали бы для отправки любых других байтов.
Используя приватное поле, я пытаюсь управлять всей процедурой в неблокирующем режиме, поэтому в конструкторе сохраняю объект для сериализации в поле src ByteBuffer и записываю объект writeObj(), используя super.write(ByteBuffer src).
Я не понимаю, какое отношение ко всему этому имеет «использование закрытого поля», учитывая, что на практике вы не можете расширить SocketChannel
в первую очередь: я также не понимаю, зачем нужно личное поле или почему вы так бы подумал.
(соответствующий объект readObj(), возвращающий null, если объект не получен полностью, или объект, если super.read() возвращает -1)
Это уже две основные ошибки проектирования. Если объект получен не полностью, вы должны продолжать получать, и если EOS происходит до того, как объект будет полностью получен, вы должны создать исключение, а не возвращать что-либо.
Проблема в том, что SocketChannel является абстрактным классом, поэтому super.read() и super.write(..) не разрешены.
Проблема в том, что (а) ваш подход к дизайну и (б) ваши детали дизайна оба (в) в корне ошибочны и (г) совершенно не нужны. Вам не нужен дополнительный код, кроме того, что требуется для получения любого сообщения протокола приложения в неблокирующем режиме. Это сложно, так как вам приходится иметь дело с частичным чтением и преждевременным завершением потока у получателя, а также с частичной записью у отправителя, но это не требует расширения SocketChannel
или других упомянутых вами мер.
Должен ли я расширять SocketChannelImpl
No.
или есть другой правильный способ сделать это?
Здесь много сообщений о том, как справиться с обоими условиями.
person
user207421
schedule
08.05.2016