public static void WriteCommandToStream <T>(Stream a_Stream, byte a_CommandSignature, T a_CommandParams) where T : class { BinaryWriter a_Writer = new BinaryWriter(a_Stream); //поток для отправки данных a_Writer.Write(a_CommandSignature); //Команда var a_CommandParamsAsBytes = DataContractUtils.SerializeToBytes(a_CommandParams); a_Writer.Write(a_CommandParamsAsBytes.Length); //Размер параметров a_Writer.Write(a_CommandParamsAsBytes); //Сами параметры }
/// <summary> /// Реализация протокола чтения точек из потока. На выходе - массив байтов, который можно десериализовать в CloudPointCluster /// </summary> /// <param name="a_Stream">Сетевой поток</param> /// <param name="a_Callback"></param> /// <returns></returns> protected static void ReadPointsFromStream(Stream a_Stream, Action <byte[]> a_Callback) { using (BinaryReader a_Reader = new BinaryReader(a_Stream)) { while (true) { //1. Флаг начала пакета int a_Flag = a_Reader.ReadInt32(); if (a_Flag == EndMarker) { break; } if (a_Flag == BaseStreamServer.ErrorMarker) { //Размер int a_ErrorSize = a_Reader.ReadInt32(); //Сама ошибка var a_ErrorBytes = a_Reader.ReadBytes(a_ErrorSize); var a_ExceptionInfo = DataContractUtils.DeserializeFromBytes <BaseStreamServer.ExceptionInfo>(a_ErrorBytes); // // создать Exception с CallStack из a_ExceptionInfo BaseStreamServer.StreamServerException a_Exception = new BaseStreamServer.StreamServerException("Ошибка при чтении ТЛО", a_ExceptionInfo); throw a_Exception; } if (a_Flag != BeginMarker) { throw new Exception("Неверный пакет"); } //Размер кластера int a_ClusterSize = a_Reader.ReadInt32(); //Сам кластер var a_Bytes = a_Reader.ReadBytes(a_ClusterSize); a_Callback(a_Bytes); } } }