public override void Serialize(Stream stream, IEnumerable <QuoteChangeMessage> data, IMarketDataMetaInfo metaInfo)
        {
            var list = data.SelectMany(d =>
            {
                var items = new List <NullableTimeQuoteChange>();

                items.AddRange(d.Bids.OrderByDescending(q => q.Price).Select(q => ToNullQuote(Sides.Buy, q, d)));

                if (items.Count == 0)
                {
                    items.Add(new NullableTimeQuoteChange
                    {
                        Side       = Sides.Buy,
                        ServerTime = d.ServerTime,
                    });
                }

                var bidsCount = items.Count;

                items.AddRange(d.Asks.OrderBy(q => q.Price).Select(q => ToNullQuote(Sides.Sell, q, d)));

                if (items.Count == bidsCount)
                {
                    items.Add(new NullableTimeQuoteChange
                    {
                        Side       = Sides.Sell,
                        ServerTime = d.ServerTime,
                    });
                }

                return(items);
            });

            _quoteSerializer.Serialize(stream, list, metaInfo);
        }
        public override void Serialize(Stream stream, IEnumerable <QuoteChangeMessage> data, IMarketDataMetaInfo metaInfo)
        {
            var csvInfo = (CsvMetaInfo)metaInfo;
            var incOnly = csvInfo.IncrementalOnly;

            var list = data.SelectMany(d =>
            {
                if (incOnly != null)
                {
                    if (incOnly.Value)
                    {
                        if (d.State == null)
                        {
                            throw new InvalidOperationException(LocalizedStrings.StorageRequiredIncremental.Put(true));
                        }
                    }
                    else
                    {
                        if (d.State != null)
                        {
                            throw new InvalidOperationException(LocalizedStrings.StorageRequiredIncremental.Put(false));
                        }
                    }
                }

                var items = new List <NullableTimeQuoteChange>();

                items.AddRange(d.Bids.OrderByDescending(q => q.Price).Select(q => ToNullQuote(Sides.Buy, q, d)));

                if (items.Count == 0)
                {
                    items.Add(new NullableTimeQuoteChange
                    {
                        Side       = Sides.Buy,
                        ServerTime = d.ServerTime,
                        State      = d.State,
                        BuildFrom  = d.BuildFrom,
                        SeqNum     = d.SeqNum.DefaultAsNull(),
                    });
                }

                var bidsCount = items.Count;

                items.AddRange(d.Asks.OrderBy(q => q.Price).Select(q => ToNullQuote(Sides.Sell, q, d)));

                if (items.Count == bidsCount)
                {
                    items.Add(new NullableTimeQuoteChange
                    {
                        Side       = Sides.Sell,
                        ServerTime = d.ServerTime,
                        State      = d.State,
                        BuildFrom  = d.BuildFrom,
                        SeqNum     = d.SeqNum.DefaultAsNull(),
                    });
                }

                return(items);
            });

            _quoteSerializer.Serialize(stream, list, metaInfo);
        }