public TimeSeriesData(String feed_key, String feed_timezone)
        {
            _feedKey = feed_key;

            _feedTimeZone = TimeZoneInfo.FindSystemTimeZoneById(feed_timezone);

            _messages = new List<NgestMessage>();

            _currentMessage = new NgestMessage(NgestMessage.TIMESERIES_TYPE, _feedKey);
            _messages.Add(_currentMessage);
        }
        public void addValue(DateTime timestamp, String field, Object value)
        {
            DateTime delocalized;

            // Delocalize timestamp, if it's not already UTC
            if (_feedTimeZone != TimeZoneInfo.Utc)
            {
                delocalized = delocalizeTimestamp(timestamp);
            } else
            {
                delocalized = timestamp;
            }



            // Stringify timestamps.. basically
            String delocalizedStr = delocalized.ToString(TIMESTAMP_FORMAT);

            try
            {
                // Try adding the data point to the current message
                bool accepted = _currentMessage.addData(
                                        delocalizedStr,
                                        field, value);

                if (!accepted)
                {
                    // Current message is full!

                    // Create new message
                    _currentMessage = new NgestMessage(NgestMessage.TIMESERIES_TYPE, _feedKey);

                    // Add data.. no way for this to fail
                    _currentMessage.addData(delocalizedStr, field, value);

                    // Add to messages list
                    _messages.Add(_currentMessage);
                }
            }
            catch (NonUniqueFieldIDException e)
            {
                Console.WriteLine("Field ID: " + field + " already exists at: "
                    + timestamp.ToString(TIMESTAMP_FORMAT));
            }
        }
        public List<String> getJSONData()
        {
            List<NgestMessage> nGestMessages = new List<NgestMessage>();

            List<TimeSeriesDataObject> dataBucket =
                new List<TimeSeriesDataObject>();

            List<String> ret = new List<String>();

            // Organize the data into buckets of MAX_BUCKET_SIZE or less
            foreach (KeyValuePair<DateTime, TimeSeriesDataObject> entry in _data)
            {
                Dictionary<String, String> bucket = new Dictionary<String, String>();

                // Get the data at this timestamp
                Dictionary<String, String> fields = entry.Value.Data;

                // Now have appropriately sized bucket of MAX_BUCKET_SIZE or less
                NgestMessage message =
                    new NgestMessage(TimeSeriesData.TYPE,
                                    _feedKey,
                                    dataBucket);

                foreach (KeyValuePair<String, String> field in fields)
                {
                    bucket.Add(field.Key, field.Value);

                    if (bucket.Keys.Count == MAX_BUCKET_SIZE)
                    {

                    }
                }

                // We want to portion the buckets into

                    // Accumulate bucket size
                    // This is basically the number of keys
                    bucketSize += entry.Value.Length;

                // Determine if this data bucket is finished
                if ((bucketSize >= MAX_BUCKET_SIZE) && (dataBucket.Count > 0))
                {
                    // Data bucket full, add to list of buckets and clear out
                    // for next time

                    nGestMessages.Add(message);
                    dataBucket = new List<TimestampedValues>();
                    bucketSize = 0;
                }

                // Something of a complicated data structure to serialize correctly
                TimestampedValues v =
                    new TimestampedValues(
                        entry.Key.ToString(TimeSeriesData.TIMESTAMP_FORMAT),
                        entry.Value.Data);

                dataBucket.Add(v);
            }

            if (dataBucket.Count > 0)
            {
                // Append any remainder values
                NgestMessage message =
                    new NgestMessage(TimeSeriesData.TYPE,
                                    _feedKey,
                                    dataBucket);

                nGestMessages.Add(message);
            }

            // Could do this in initial loop.. breaking it out to its own loop for simplicity
            foreach(var message in nGestMessages)
            {

                // Serialize and add to return list
                ret.Add(JsonConvert.SerializeObject(message, Formatting.Indented));
            }

            return ret;
        }