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);
                }
            }
        }