Ответ 1
Режим передачи труб - это концепция операционной системы Windows, а не концепция .NET. Если в режиме сообщений создается канал, каждая запись в канал отправителем рассматривается как отдельное сообщение. Приемник может считывать из трубы:
- в режиме байта, когда данные считываются из канала как поток байтов, полностью игнорируя границы неявного сообщения; или
- в режиме сообщения, когда данные считываются как поток сообщений в том смысле, что любое чтение будет принимать только байты, относящиеся к одному сообщению, и специальный код ошибки возвращается собственным API, чтобы указать, есть ли еще байты для этого же сообщения.
Обтекание этой функциональностью .NET, как показано в пространстве имен System.IO.Pipes
, достаточно близко соответствует основной нативной модели:
- границы сообщений по-прежнему
определяемый по образцу вызовов, сделанных отправителем
PipeStream.Write()
илиPipeStream.WriteByte()
- данные записанный в каждом вызове, рассматривается как отдельный сообщение; - ресивер может установить
ReadMode
наPipeTransmissionMode.Message
, а затем каждый вызовPipeStream.Read()
илиPipeStream.ReadByte()
будет читать следующий фрагмент данных из текущего сообщения, пока значениеPipeStream.IsMessageComplete
не изменится наtrue
, показывая, что все байты для этого сообщения имеют прочитано
Все чтения и записи выполняются в байтах или массивах байтов. Вы можете отправлять любые байты, которые вам нравятся, по трубе. TransmissionMode не влияет на это.
Итак, да, вы можете отправить сериализованный объект в виде сообщения, если вы пишете все байты его сериализованного представления в трубе одним вызовом PipeStream.Write()
.