public static void PushCluster(BinaryWriter a_Writer, CloudPointCluster a_Cluster)
        {
            //Пустой кластер не пишем
            if (a_Cluster.Points.Count == 0)
            {
                return;
            }

            a_Writer.Write(BeginMarker);
            using (MemoryStream a_MemoryStream = new MemoryStream())
            {
                using (BinaryWriter a_MemWriter = new BinaryWriter(a_MemoryStream))
                {
                    //Сериализуем кластер в байты
                    a_Cluster.SerializeBinary(a_MemWriter);
                    a_MemWriter.Flush();

                    int a_Size = (int)a_MemoryStream.Position;

                    //Записываем размер кластера
                    a_Writer.Write(a_Size);

                    //Записываем сам пакет в виде байтов
                    a_Writer.Write(a_MemoryStream.GetBuffer(), 0, a_Size);
                }
            }
        }
 /// <summary>
 /// Реализация протокола чтения точек из потока. На выходе - готовый CloudPointCluster
 /// </summary>
 /// <param name="a_Stream">Сетевой поток</param>
 /// <param name="a_Callback"></param>
 /// <returns></returns>
 protected static void ReadPointsFromStream(Stream a_Stream, Action <CloudPointCluster> a_Callback)
 {
     ReadPointsFromStream(a_Stream, delegate(byte[] a_Bytes)
     {
         using (var a_MemoryStream = new MemoryStream(a_Bytes))
             using (var a_Reader = new BinaryReader(a_MemoryStream))
             {
                 CloudPointCluster a_PointCluster = new CloudPointCluster();
                 a_PointCluster.DeserializeBinary(a_Reader);
                 a_Callback(a_PointCluster);
             }
     });
 }