/// <summary> /// /// </summary> /// <param name="dataPoints"></param> /// <returns></returns> public static IEnumerable <byte> Compress(IEnumerable <DataPoint <dynamic> > dataPoints) { if (dataPoints.Select(_ => _.TimeSeries).Distinct().Count() > 1) { throw new Exception("Unable to compress data points: All data points must come from the same time series."); } var timeSeries = ByteString.CopyFrom(dataPoints.First().TimeSeries.Value.ToByteArray()); var firstTimestamp = dataPoints.First().Timestamp.Value; var protobufDataPoints = dataPoints.Select(_ => _.ToProtobuf()).ToArray(); var frame = new Protobuf.TimeSeriesFrame { TimeSeries = timeSeries, Timestamp = (ulong)firstTimestamp }; var payload = new Protobuf.TimeSeriesPayload(); payload = payload.Append(protobufDataPoints); frame.UncompressedPayload = payload; frame = frame.Compress(); var encoded = frame.ToByteArray(); byte[] length = BitConverter.GetBytes((int)encoded.Length); return(length.Concat(encoded)); }