#serialization #websocket #dart
#сериализация #websocket #dart
Вопрос:
Как передать объект WebSocket через Websocket?
ws.onOpen.listen((e) {
outputMsg('Connected');
WebSocket otherWebSocket = ...;
ws.send(otherWebSocket); // does not work
});
Комментарии:
1. «не работает» Что происходит вместо этого? Вероятно, веб-сокет не может быть сериализован и десериализован разумным способом.
2. Это просто невозможно. В какой-то момент WebSocket оборачивает собственный сокет ОС, и вы никак не можете осмысленно сериализовать сокет ОС.
3. Я так и думал. RTC не развивается. О соединениях между браузерами можно пока забыть о p2p…
4. Можете ли вы отправить факс по факсу? Можете ли вы отправить сообщение по телефонному звонку?
5. Зачем вам это делать?
Ответ №1:
Согласно существующим комментариям, нет смысла напрямую сериализовать объект, подобный web socket. Однако, есть трюк, который, как я видел, был выполнен в Python, который может быть полезен здесь. Прошу прощения, если это немного расплывчато; я не знаю Dart.
Хитрость заключается в написании класса, который бы обертывал WebSocket и имел метод, вызываемый для сериализации. Конструктору класса потребуется сохранить параметры конструктора.
Затем метод сериализации может сериализовать эти параметры конструктора и любые другие существующие данные «состояния» (например, байты, еще не прочитанные из веб-сокета, любые данные, относящиеся к разговору с сервером, такие как ключи, идентификатор клиента и т.д.) и закрыть WebSocket.
Получатель сможет создать новый WebSocket на основе этих параметров и возобновить взаимодействие с сервером на основе этих данных состояния.
Очевидно, что это потребовало бы, чтобы сервер на другом конце сокета сотрудничал в закрытии и повторном открытии сокета и продолжал, как будто ничего не произошло. Если сервер не собирается этого делать, то этот метод не будет работать.
Код Python, на который я ссылаюсь, касается того, как сериализовать файловый дескриптор. Все, что он делает, это сериализует путь и имя файла, текущую позицию файла, режим чтения / записи и т.д. Это позволяет получателю сериализованного файла повторно открыть файл в точно таком же состоянии, в каком он был ранее.