コード例 #1
0
        /// <inheritdoc />
        protected override ExecutionMessage Read(FastCsvReader reader, IMarketDataMetaInfo metaInfo)
        {
            var ol = new ExecutionMessage
            {
                SecurityId    = SecurityId,
                ExecutionType = ExecutionTypes.OrderLog,
                ServerTime    = reader.ReadTime(metaInfo.Date),
                TransactionId = reader.ReadLong(),
                OrderId       = reader.ReadLong(),
                OrderPrice    = reader.ReadDecimal(),
                OrderVolume   = reader.ReadDecimal(),
                Side          = reader.ReadEnum <Sides>(),
                OrderState    = reader.ReadEnum <OrderStates>(),
                TimeInForce   = reader.ReadNullableEnum <TimeInForce>(),
                TradeId       = reader.ReadNullableLong(),
                TradePrice    = reader.ReadNullableDecimal(),
                PortfolioName = reader.ReadString(),
                IsSystem      = reader.ReadNullableBool(),
            };

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                ol.Balance = reader.ReadNullableDecimal();
            }

            return(ol);
        }
コード例 #2
0
            protected override ExchangeBoard Read(FastCsvReader reader)
            {
                var board = new ExchangeBoard
                {
                    Code       = reader.ReadString(),
                    Exchange   = GetExchange(reader.ReadString()),
                    ExpiryTime = reader.ReadString().ToTime(),
                    //IsSupportAtomicReRegister = reader.ReadBool(),
                    //IsSupportMarketOrders = reader.ReadBool(),
                    TimeZone = reader.ReadString().To <TimeZoneInfo>(),
                };

                var time = board.WorkingTime;

                if (reader.ColumnCount == 7)
                {
                    time.Periods            = Deserialize <List <WorkingTimePeriod> >(reader.ReadString());
                    time.SpecialWorkingDays = Deserialize <IEnumerable <DateTime> >(reader.ReadString()).ToArray();
                    time.SpecialHolidays    = Deserialize <IEnumerable <DateTime> >(reader.ReadString()).ToArray();
                }
                else
                {
                    time.Periods.AddRange(reader.ReadString().DecodeToPeriods());
                    time.SpecialDays.AddRange(reader.ReadString().DecodeToSpecialDays());

                    if ((reader.ColumnCurr + 1) < reader.ColumnCount)
                    {
                        reader.Skip();

                        time.IsEnabled = reader.ReadBool();
                    }
                }

                return(board);
            }
コード例 #3
0
        /// <inheritdoc />
        protected override ExecutionMessage Read(FastCsvReader reader, IMarketDataMetaInfo metaInfo)
        {
            var execMsg = new ExecutionMessage
            {
                SecurityId    = SecurityId,
                ExecutionType = ExecutionTypes.Tick,
                ServerTime    = reader.ReadTime(metaInfo.Date),
                TradeId       = reader.ReadNullableLong(),
                TradePrice    = reader.ReadNullableDecimal(),
                TradeVolume   = reader.ReadNullableDecimal(),
                OriginSide    = reader.ReadNullableEnum <Sides>(),
                OpenInterest  = reader.ReadNullableDecimal(),
                IsSystem      = reader.ReadNullableBool(),
            };

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                execMsg.IsUpTick      = reader.ReadNullableBool();
                execMsg.TradeStringId = reader.ReadString();
                execMsg.Currency      = reader.ReadNullableEnum <CurrencyTypes>();
            }

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                execMsg.BuildFrom = reader.ReadBuildFrom();
            }

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                execMsg.SeqNum = reader.ReadNullableLong() ?? 0L;
            }

            return(execMsg);
        }
コード例 #4
0
        /// <inheritdoc />
        protected override TCandleMessage Read(FastCsvReader reader, IMarketDataMetaInfo metaInfo)
        {
            var message = new TCandleMessage
            {
                SecurityId  = SecurityId,
                Arg         = Arg,
                OpenTime    = reader.ReadTime(metaInfo.Date),
                OpenPrice   = reader.ReadDecimal(),
                HighPrice   = reader.ReadDecimal(),
                LowPrice    = reader.ReadDecimal(),
                ClosePrice  = reader.ReadDecimal(),
                TotalVolume = reader.ReadDecimal(),
                State       = CandleStates.Finished
            };

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                message.BuildFrom = reader.ReadBuildFrom();
            }

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                message.SeqNum = reader.ReadNullableLong() ?? 0L;
            }

            return(message);
        }
コード例 #5
0
        /// <inheritdoc />
        protected override NewsMessage Read(FastCsvReader reader, IMarketDataMetaInfo metaInfo)
        {
            var news = new NewsMessage
            {
                ServerTime = reader.ReadTime(metaInfo.Date),
                Headline   = reader.ReadString(),
                Source     = reader.ReadString(),
                Url        = reader.ReadString().To <Uri>(),
                Id         = reader.ReadString(),
                BoardCode  = reader.ReadString(),
            };

            var secCode = reader.ReadString();

            if (!secCode.IsEmpty())
            {
                news.SecurityId = new SecurityId {
                    SecurityCode = secCode
                }
            }
            ;

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                news.Priority = reader.ReadNullableEnum <NewsPriorities>();
            }

            return(news);
        }
    }
コード例 #6
0
            protected override Position Read(FastCsvReader reader)
            {
                var pfName = reader.ReadString();
                var secId  = reader.ReadString();

                var position = new Position
                {
                    Portfolio       = GetPortfolio(pfName),
                    Security        = GetSecurity(secId),
                    DepoName        = reader.ReadString(),
                    LimitType       = reader.ReadNullableEnum <TPlusLimits>(),
                    BeginValue      = reader.ReadNullableDecimal(),
                    CurrentValue    = reader.ReadNullableDecimal(),
                    BlockedValue    = reader.ReadNullableDecimal(),
                    VariationMargin = reader.ReadNullableDecimal(),
                    Commission      = reader.ReadNullableDecimal(),
                    Currency        = reader.ReadNullableEnum <CurrencyTypes>(),
                    LastChangeTime  = _dateTimeParser.Parse(reader.ReadString()).ChangeKind(DateTimeKind.Utc),
                    LocalTime       = _dateTimeParser.Parse(reader.ReadString()).ChangeKind(DateTimeKind.Utc)
                };

                if (position.Security == null)
                {
                    throw new InvalidOperationException(LocalizedStrings.Str1218Params.Put(secId));
                }

                if (position.Portfolio == null)
                {
                    throw new InvalidOperationException(LocalizedStrings.Str891);
                }

                return(position);
            }
コード例 #7
0
            protected override Exchange Read(FastCsvReader reader)
            {
                var board = new Exchange
                {
                    Name        = reader.ReadString(),
                    CountryCode = reader.ReadNullableEnum <CountryCodes>(),
                    //EngName = reader.ReadString(),
                    //RusName = reader.ReadString(),
                    //ExtensionInfo = Deserialize<Dictionary<object, object>>(reader.ReadString())
                };

                var engName = reader.ReadString();

                reader.Skip();

                if ((reader.ColumnCurr + 1) < reader.ColumnCount)
                {
                    board.FullNameLoc = reader.ReadString();
                }
                else
                {
                    board.FullNameLoc = LocalizedStrings.LocalizationManager.GetResourceId(engName) ?? engName;
                }

                return(board);
            }
コード例 #8
0
        public void TestEmptyQuotedCell()
        {
            var result = FastCsvReader.ReadAs <BuaData>(emptyQuotedCell).ToArray();

            Assert.That(result[0].Code, Is.EqualTo(string.Empty));
            Assert.That(result[0].Name, Is.EqualTo("Value"));
        }
コード例 #9
0
            public override void Read(Stream stream)
            {
                CultureInfo.InvariantCulture.DoInCulture(() =>
                {
                    var count         = 0;
                    var firstTimeRead = false;

                    var reader = new FastCsvReader(stream, _encoding);

                    while (reader.NextLine())
                    {
                        var message = _serializer.Read(reader, this);

                        var openTime = message.OpenTime.UtcDateTime;

                        _items.Add(openTime, message);

                        if (!firstTimeRead)
                        {
                            FirstTime     = openTime;
                            firstTimeRead = true;
                        }

                        LastTime = openTime;

                        count++;
                    }

                    Count = count;

                    stream.Position = 0;
                });
            }
コード例 #10
0
        public void TestSingleQuotes()
        {
            var result = FastCsvReader.ReadAs <BuaData>(singleQuotes).ToArray();

            Assert.That(result.Length, Is.EqualTo(1));
            Assert.That(result[0].Name, Is.EqualTo("Hart's Lane, nr Langham (Colchester) BUA"));
        }
コード例 #11
0
        /// <summary>
        /// Read data from the specified reader.
        /// </summary>
        /// <param name="reader">CSV reader.</param>
        /// <param name="date">Date.</param>
        /// <returns>Data.</returns>
        protected override NewsMessage Read(FastCsvReader reader, DateTime date)
        {
            var news = new NewsMessage
            {
                ServerTime = reader.ReadTime(date),
                Headline   = reader.ReadString(),
                Source     = reader.ReadString(),
                Url        = reader.ReadString().To <Uri>(),
                Id         = reader.ReadString(),
                BoardCode  = reader.ReadString(),
            };

            var secCode = reader.ReadString();

            if (!secCode.IsEmpty())
            {
                news.SecurityId = new SecurityId {
                    SecurityCode = secCode
                }
            }
            ;

            return(news);
        }
    }
コード例 #12
0
        public void TestBadDataWithCustomParser()
        {
            var converter = new DefaultConverterSpec();

            converter.SetConverter <int?>(s =>
            {
                if (string.IsNullOrWhiteSpace(s))
                {
                    return(null);
                }
                if (!int.TryParse(s, out int value))
                {
                    return(null);
                }
                return(value);
            });
            var result = FastCsvReader.ReadAs <DefaultData2>(testData3, '¬', converter).ToArray();

            Assert.That(result.Length, Is.EqualTo(4));
            Assert.That(result[0].Area, Is.EqualTo(1));
            Assert.That(result[0].QuotaValuesAndResults, Is.EqualTo("Full Time, Part-Time and Zero-hour"));
            Assert.That(result[0].Remarks, Is.Empty);
            Assert.That(result[0].Notes, Is.Empty);
            Assert.That(result[1].QuotaValuesAndResults, Is.EqualTo("Part-Time"));
            Assert.That(result[1].Notes, Is.Empty);
            Assert.That(result[2].Area, Is.Null);
            Assert.That(result[2].QuotaValuesAndResults, Is.Not.Null.Or.Empty);
            Assert.That(result[3].Area, Is.Null);
        }
コード例 #13
0
            protected override ExchangeBoard Read(FastCsvReader reader)
            {
                var board = new ExchangeBoard
                {
                    Code       = reader.ReadString(),
                    Exchange   = GetExchange(reader.ReadString()),
                    ExpiryTime = reader.ReadString().ToTime(),
                    //IsSupportAtomicReRegister = reader.ReadBool(),
                    //IsSupportMarketOrders = reader.ReadBool(),
                    TimeZone = TimeZoneInfo.FindSystemTimeZoneById(reader.ReadString()),
                };

                var time = board.WorkingTime;

                if (reader.ColumnCount == 7)
                {
                    time.Periods            = Deserialize <List <WorkingTimePeriod> >(reader.ReadString());
                    time.SpecialWorkingDays = Deserialize <IEnumerable <DateTime> >(reader.ReadString()).ToArray();
                    time.SpecialHolidays    = Deserialize <IEnumerable <DateTime> >(reader.ReadString()).ToArray();
                }
                else
                {
                    time.Periods.AddRange(reader.ReadString().DecodeToPeriods());
                    time.SpecialDays.AddRange(reader.ReadString().DecodeToSpecialDays());
                }

                //ExtensionInfo = Deserialize<Dictionary<object, object>>(reader.ReadString())

                return(board);
            }
コード例 #14
0
        /// <inheritdoc />
        protected override NewsMessage Read(FastCsvReader reader, IMarketDataMetaInfo metaInfo)
        {
            var news = new NewsMessage
            {
                ServerTime = reader.ReadTime(metaInfo.Date),
                Headline   = reader.ReadString(),
                Source     = reader.ReadString(),
                Url        = reader.ReadString(),
                Id         = reader.ReadString(),
                BoardCode  = reader.ReadString(),
            };

            var secCode = reader.ReadString();

            if (!secCode.IsEmpty())
            {
                news.SecurityId = new SecurityId {
                    SecurityCode = secCode
                }
            }
            ;

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                news.Priority = reader.ReadNullableEnum <NewsPriorities>();
            }

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                news.Language = reader.ReadString();
            }

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                var boardCode = reader.ReadString();

                if (news.SecurityId != null)
                {
                    var secId = news.SecurityId.Value;
                    secId.BoardCode = boardCode;
                    news.SecurityId = secId;
                }
            }

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                news.ExpiryDate = reader.ReadString().TryToDateTimeOffset(_expiryFormat);
            }

            if ((reader.ColumnCurr + 1) < reader.ColumnCount)
            {
                news.SeqNum = reader.ReadNullableLong() ?? 0L;
            }

            return(news);
        }
    }
コード例 #15
0
        public void TestMultiAttribute()
        {
            var result = FastCsvReader.ReadAs <MultiAttr>(testData4).ToArray();

            Assert.That(result.Length, Is.EqualTo(1));
            Assert.That(result[0].Code, Is.EqualTo("AAA"));
            Assert.That(result[0].Name, Is.EqualTo("BBB"));
            Assert.That(result[0].Notes, Is.EqualTo("CCC"));
        }
コード例 #16
0
        /// <summary>
        /// Read <see cref="DateTimeOffset"/>.
        /// </summary>
        /// <param name="reader">CSV reader.</param>
        /// <param name="date">Date.</param>
        /// <returns><see cref="DateTimeOffset"/>.</returns>
        internal static DateTimeOffset ReadTime(FastCsvReader reader, DateTime date)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            return((date + TimeParser.Parse(reader.ReadString())).ToDateTimeOffset(TimeSpan.Parse(reader.ReadString().Remove("+"))));
        }
コード例 #17
0
ファイル: CsvHelper.cs プロジェクト: zjxbetter/StockSharp
        /// <summary>
        /// Read <see cref="DateTimeOffset"/>.
        /// </summary>
        /// <param name="reader">CSV reader.</param>
        /// <param name="date">Date.</param>
        /// <returns><see cref="DateTimeOffset"/>.</returns>
        public static DateTimeOffset ReadTime(this FastCsvReader reader, DateTime date)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            return((date + reader.ReadDateTime(TimeFormat).TimeOfDay).ToDateTimeOffset(TimeSpan.Parse(reader.ReadString().Replace("+", string.Empty))));
        }
コード例 #18
0
        /// <inheritdoc />
        protected override PositionChangeMessage Read(FastCsvReader reader, IMarketDataMetaInfo metaInfo)
        {
            var posMsg = new PositionChangeMessage
            {
                SecurityId    = SecurityId,
                ServerTime    = reader.ReadTime(metaInfo.Date),
                PortfolioName = reader.ReadString(),
                ClientCode    = reader.ReadString(),
                DepoName      = reader.ReadString(),
                LimitType     = reader.ReadString().To <TPlusLimits?>(),
            };

            foreach (var type in _types)
            {
                switch (type)
                {
                case PositionChangeTypes.Currency:
                {
                    var currency = reader.ReadNullableEnum <CurrencyTypes>();

                    if (currency != null)
                    {
                        posMsg.Changes.Add(type, currency);
                    }

                    break;
                }

                case PositionChangeTypes.State:
                {
                    var state = reader.ReadNullableEnum <PortfolioStates>();

                    if (state != null)
                    {
                        posMsg.Changes.Add(type, state);
                    }

                    break;
                }

                default:
                {
                    var value = reader.ReadNullableDecimal();

                    if (value != null)
                    {
                        posMsg.Changes.Add(type, value);
                    }

                    break;
                }
                }
            }

            return(posMsg);
        }
コード例 #19
0
        private void LoadFile(string fileName)
        {
            CultureInfo.InvariantCulture.DoInCulture(() =>
            {
                if (!File.Exists(fileName))
                {
                    return;
                }

                var name = Path.GetFileNameWithoutExtension(fileName);

                var pairs = new List <Tuple <SecurityId, object> >();

                using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                {
                    var reader = new FastCsvReader(stream, Encoding.UTF8);

                    reader.NextLine();
                    reader.Skip(2);

                    var type1 = reader.ReadString().To <Type>();
                    var type2 = reader.ReadString().To <Type>();

                    var isTuple = type2 != null;

                    while (reader.NextLine())
                    {
                        var securityId = new SecurityId
                        {
                            SecurityCode = reader.ReadString(),
                            BoardCode    = reader.ReadString()
                        };

                        var nativeId = reader.ReadString().To(type1);

                        if (isTuple)
                        {
                            var nativeId2 = reader.ReadString().To(type2);
                            nativeId      = typeof(Tuple <,>).MakeGenericType(type1, type2).CreateInstance(new[] { nativeId, nativeId2 });
                        }

                        pairs.Add(Tuple.Create(securityId, nativeId));
                    }
                }

                lock (_sync)
                {
                    var nativeIds = _nativeIds.SafeAdd(name);

                    foreach (var tuple in pairs)
                    {
                        nativeIds.Add(tuple.Item1, tuple.Item2);
                    }
                }
            });
        }
コード例 #20
0
 /// <summary>
 /// Read data from the specified reader.
 /// </summary>
 /// <param name="reader">CSV reader.</param>
 /// <param name="date">Date.</param>
 /// <returns>Data.</returns>
 protected override TimeQuoteChange Read(FastCsvReader reader, DateTime date)
 {
     return(new TimeQuoteChange
     {
         ServerTime = ReadTime(reader, date),
         Price = reader.ReadDecimal(),
         Volume = reader.ReadDecimal(),
         Side = reader.ReadEnum <Sides>()
     });
 }
コード例 #21
0
 /// <summary>
 /// Read data from the specified reader.
 /// </summary>
 /// <param name="reader">CSV reader.</param>
 /// <param name="metaInfo">Meta-information on data for one day.</param>
 /// <returns>Data.</returns>
 protected override NullableTimeQuoteChange Read(FastCsvReader reader, IMarketDataMetaInfo metaInfo)
 {
     return(new NullableTimeQuoteChange
     {
         ServerTime = reader.ReadTime(metaInfo.Date),
         Price = reader.ReadNullableDecimal(),
         Volume = reader.ReadDecimal(),
         Side = reader.ReadEnum <Sides>()
     });
 }
コード例 #22
0
        /// <inheritdoc />
        protected override BoardStateMessage Read(FastCsvReader reader, IMarketDataMetaInfo metaInfo)
        {
            var state = new BoardStateMessage
            {
                ServerTime = reader.ReadTime(metaInfo.Date),
                BoardCode  = reader.ReadString(),
                State      = reader.ReadEnum <SessionStates>()
            };

            return(state);
        }
コード例 #23
0
ファイル: CaseLoader.cs プロジェクト: veydart/petrovich-net
 public static IEvalCase[] LoadCase(TextReader textReader)
 {
     using (var table = new FastCsvReader(textReader, new FastCsvReaderSettings()
     {
         FieldDelimiter = '\t'
     }))
     {
         table.HandleHeaderRow();
         return(table.ReadToEnd <EvalCase>().ToArray <IEvalCase>());
     }
 }
コード例 #24
0
        private static DateTimeOffset?ReadNullableDateTime(FastCsvReader reader)
        {
            var str = reader.ReadString();

            if (str == null)
            {
                return(null);
            }

            return(_dateTimeParser.Parse(str).ChangeKind(DateTimeKind.Utc));
        }
コード例 #25
0
        public void TestAdditionalColumns()
        {
            var result = FastCsvReader.ReadAs <AdditionalColumnsData>(testData4).ToArray();

            Assert.That(result.Length, Is.EqualTo(1));
            Assert.That(result[0].Code, Is.EqualTo("AAA"));
            Assert.That(result[0].Columns.Keys.Count, Is.EqualTo(2));
            Assert.That(result[0].Columns.ContainsKey("Name1"), Is.EqualTo(true));
            Assert.That(result[0].Columns.ContainsKey("Notes"), Is.EqualTo(true));
            Assert.That(result[0].Columns["Name1"], Is.EqualTo("BBB"));
            Assert.That(result[0].Columns["Notes"], Is.EqualTo("CCC"));
        }
コード例 #26
0
        public void TestReadWithCommasAllFieldsPresent()
        {
            var result = FastCsvReader.ReadAs <DefaultData>(testData1).ToArray();

            Assert.That(result.Length, Is.EqualTo(2));
            Assert.That(result[0].Area, Is.EqualTo(1));
            Assert.That(result[0].Quota, Is.EqualTo(" Full Time"));
            Assert.That(result[0].Remarks, Is.Empty);
            Assert.That(result[0].Notes, Is.Empty);
            Assert.That(result[1].Quota, Is.EqualTo(" Part-Time"));
            Assert.That(result[1].Notes, Is.EqualTo("This is a note"));
        }
コード例 #27
0
        public void TestReadWithTrimmingConverter()
        {
            var result = FastCsvReader.ReadAs <DefaultData>(testData1, converter: ConverterSpecs.StringTrim).ToArray();

            Assert.That(result.Length, Is.EqualTo(2));
            Assert.That(result[0].Area, Is.EqualTo(1));
            Assert.That(result[0].Quota, Is.EqualTo("Full Time"));
            Assert.That(result[0].Remarks, Is.Empty);
            Assert.That(result[0].Notes, Is.Empty);
            Assert.That(result[1].Quota, Is.EqualTo("Part-Time"));
            Assert.That(result[1].Notes, Is.EqualTo("This is a note"));
        }
コード例 #28
0
        public void TestWithContainedQuotedCommasAndTrimming()
        {
            var result = FastCsvReader.ReadAs <DefaultData2>(testData2, converter: ConverterSpecs.StringTrim).ToArray();

            Assert.That(result.Length, Is.EqualTo(2));
            Assert.That(result[0].Area, Is.EqualTo(1));
            Assert.That(result[0].QuotaValuesAndResults, Is.EqualTo("Full Time, Part-Time and Zero-hour"));
            Assert.That(result[0].Remarks, Is.Empty);
            Assert.That(result[0].Notes, Is.Empty);
            Assert.That(result[1].QuotaValuesAndResults, Is.EqualTo("Part-Time"));
            Assert.That(result[1].Notes, Is.EqualTo("This is a note"));
        }
コード例 #29
0
            public void Init()
            {
                if (!File.Exists(_fileName))
                {
                    return;
                }

                CultureInfo.InvariantCulture.DoInCulture(() =>
                {
                    using (var stream = new FileStream(_fileName, FileMode.Open, FileAccess.Read))
                    {
                        var reader = new FastCsvReader(stream, Encoding.UTF8);

                        reader.NextLine();
                        reader.Skip();

                        var fields = new string[reader.ColumnCount - 1];

                        for (var i = 0; i < reader.ColumnCount - 1; i++)
                        {
                            fields[i] = reader.ReadString();
                        }

                        reader.NextLine();
                        reader.Skip();

                        var types = new Type[reader.ColumnCount - 1];

                        for (var i = 0; i < reader.ColumnCount - 1; i++)
                        {
                            types[i] = reader.ReadString().To <Type>();
                            _fieldTypes.Add(fields[i], types[i]);
                        }

                        var idGenerator = new SecurityIdGenerator();

                        while (reader.NextLine())
                        {
                            var secId = idGenerator.Split(reader.ReadString());

                            var values = new Dictionary <object, object>();

                            for (var i = 0; i < fields.Length; i++)
                            {
                                values[fields[i]] = reader.ReadString().To(types[i]);
                            }

                            _cache.Add(secId, values);
                        }
                    }
                });
            }
コード例 #30
0
            protected override Exchange Read(FastCsvReader reader)
            {
                var board = new Exchange
                {
                    Name        = reader.ReadString(),
                    CountryCode = reader.ReadNullableEnum <CountryCodes>(),
                    EngName     = reader.ReadString(),
                    RusName     = reader.ReadString(),
                    //ExtensionInfo = Deserialize<Dictionary<object, object>>(reader.ReadString())
                };

                return(board);
            }