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