private void SerializeCustom() { var s = new CustomBinaryFormatter(); var message = new CustomTypicalMessage() { StringProp = "hello", GuidProp = Guid.NewGuid(), IntProp = 123, DateProp = DateTime.UtcNow, }; s.Register <CustomTypicalMessage>(0); var stream = new MemoryStream(); s.Serialize(stream, message); var bytes = stream.ToArray(); RunTest("Greg Young Custom Serializer", () => { var stream2 = new MemoryStream(); s.Serialize(stream2, message); }, () => { stream.Position = 0; s.Deserialize(stream); }, bytes.Length); }
/// <summary> /// /// </summary> /// <returns></returns> public byte[] Serialize() { CustomBinaryFormatter bf = new CustomBinaryFormatter(); MemoryStream ms = new MemoryStream(); bf.Serialize(ms, this); return(ms.ToArray()); }
static void Main(string[] args) { var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.ExchangeDeclare(exchange: "sms", type: "direct"); var queueName = channel.QueueDeclare().QueueName; channel.QueueBind(queue: queueName, exchange: "sms", routingKey: "send"); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var binaryFormatter = new CustomBinaryFormatter(); var sms = binaryFormatter.FromByteArray <SendSmsEvent>(body); // emulate some work - using Twillio to send message, for example Thread.Sleep(1000); Console.WriteLine($"Received message (version - {sms.Version}) from '{sms.From}' to '{sms.To}' with next text: {sms.Body}"); // send message, that sms was send var replyProps = channel.CreateBasicProperties(); replyProps.CorrelationId = ea.BasicProperties.CorrelationId; var smsSend = new SmsIsSendEvent { Id = sms.Id }; byte[] smsSendBody = binaryFormatter.ToByteArray(smsSend); channel.BasicPublish(exchange: "sms", routingKey: ea.BasicProperties.ReplyTo, basicProperties: replyProps, body: smsSendBody); // processed successfully channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); }; channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } }
public static void Deserialize(byte[] data, Action <SactaMsg> deliver, Action <string> deliverError) { try { MemoryStream ms = new MemoryStream(data); CustomBinaryFormatter bf = new CustomBinaryFormatter(); SactaMsg msg = bf.Deserialize <SactaMsg>(ms); deliver(msg); } catch (Exception x) { Logger.Exception <SactaMsg>(x); deliverError(x.Message); } }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="dg"></param> void OnNewData(object sender, DataGram dg) { try { MemoryStream ms = new MemoryStream(dg.Data); CustomBinaryFormatter bf = new CustomBinaryFormatter(); SactaMsg msg = bf.Deserialize <SactaMsg>(ms); if (IsValid(msg)) { int net = (sender == _Comm[0] ? 0 : 1); _LastScvReceived[net] = DateTime.Now; switch (msg.Type) { case SactaMsg.MsgType.Presence: _ActivityTimeOut = (uint)(((SactaMsg.PresenceInfo)(msg.Info)).ActivityTimeOutSg * 1000); if (_ActivityTimeOut < 5) { _ActivityTimeOut = Settings.Default.ActivityTimeOut; } break; case SactaMsg.MsgType.SectAsk: SendSectorization(net, _SectorUcs, msg.UserOrg); MainForm.LogMethod("INFO", net == 0 ? "SACTA1" : "SACTA2", "Recibida Peticion de Sectorizacion"); break; case SactaMsg.MsgType.SectAnwer: SactaMsg.SectAnswerInfo info = (SactaMsg.SectAnswerInfo)(msg.Info); MainForm.LogMethod("INFO", net == 0 ? "SACTA1" : "SACTA2", String.Format("Sectorizacion V-{0}: {1}", info.Version, (info.Result == 1 ? "Implantada" : "Rechazada"))); break; case SactaMsg.MsgType.Init: MainForm.LogMethod("INFO", net == 0 ? "SACTA1" : "SACTA2", "Recibido MSG INIT"); _SeqNum = 0; break; } } } catch (Exception ex) { if (!_Disposed) { MainForm.LogMethod("ERROR", "OnNewData", String.Format("Excepción al Procesar Datos Recibidos: {0}", ex.Message)); } } }
public static void RegisterMessagesWithSerializer(CustomBinaryFormatter formatter) { formatter.Register <VMSpawnMeessage>(1000); formatter.Register <TerminateMessage>(1001); formatter.Register <VMTerminating>(1002); formatter.Register <VMInitializedMessage>(1003); formatter.Register <VMSpawnedMessage>(1004); formatter.Register <DiagnosticInstanceMessage>(1008); formatter.Register <PauseVMMessage>(1009); formatter.Register <ResumeVMMessage>(1010); formatter.Register <ForceFullRunMessage>(1011); formatter.Register <RunRecursiveRunDetectorMessage>(1012); formatter.Register <RecursiveRunResultMessage>(1013); formatter.Register <InvalidLicenseMessage>(1014); formatter.Register <RegisterLicenseMessage>(1015); formatter.Register <ValidLicenseMessage>(1016); formatter.Register <ConfigurationUpdateMessage>(1017); formatter.Register <RunRelatedTestsMessage>(1019); formatter.Register <ManualMinimizationRequestMessage>(1020); formatter.Register <AssembliesMinimizedMessage>(1021); formatter.Register <UpdateCustomOutputpathMessage>(1022); formatter.Register <GoToFileAndLineMessage>(1023); formatter.Register <RequestVisualGraphMessage>(1024); formatter.Register <VisualGraphGeneratedMessage>(1025); formatter.Register <RequestRiskMetricsMessage>(1026); formatter.Register <RiskMetricGeneratedMessage>(1027); formatter.Register <RequestMessage <AssemblyPathRequest, AssemblyPathResponse> >(1028); formatter.Register <AssemblyPathResponse>(1029); formatter.Register <RequestMessage <IsSolutionInitializedRequest, IsSolutionInitializedResponse> >(1030); formatter.Register <IsSolutionInitializedResponse>(1031); formatter.Register <PartialRunMessage>(1032); formatter.Register <RealtimeChangeMessage>(1033); formatter.Register <ProfilerCompletedMessage>(1034); formatter.Register <ProfilerInitializedMessage>(1035); formatter.Register <RequestRuntimeTestInformationMessage>(1036); formatter.Register <TestInformationGeneratedMessage>(1037); formatter.Register <RealtimeChangeList>(1038); formatter.Register <OrderedBuildList>(1039); formatter.Register <RequestMessage <OrderedBuildList, OrderedBuildList> >(1040); formatter.Register <MinimizerInitializedMessage>(1041); formatter.Register <ProfiledTestRunStarted>(1042); formatter.Register <ProfilerLoadErrorOccurredMessage>(1043); formatter.Register <GetLastAffectedGraphMessage>(1044); formatter.Register <TestProfilerCorruptedMessage>(1045); formatter.Register <RequestProfiledGraphMessage>(1046); }
public static void RegisterMessagesWithSerializer(CustomBinaryFormatter formatter) { formatter.Register<VMSpawnMeessage>(1000); formatter.Register<TerminateMessage>(1001); formatter.Register<VMTerminating>(1002); formatter.Register<VMInitializedMessage>(1003); formatter.Register<VMSpawnedMessage>(1004); formatter.Register<DiagnosticInstanceMessage>(1008); formatter.Register<PauseVMMessage>(1009); formatter.Register<ResumeVMMessage>(1010); formatter.Register<ForceFullRunMessage>(1011); formatter.Register<RunRecursiveRunDetectorMessage>(1012); formatter.Register<RecursiveRunResultMessage>(1013); formatter.Register<InvalidLicenseMessage>(1014); formatter.Register<RegisterLicenseMessage>(1015); formatter.Register<ValidLicenseMessage>(1016); formatter.Register<ConfigurationUpdateMessage>(1017); formatter.Register<RunRelatedTestsMessage>(1019); formatter.Register<ManualMinimizationRequestMessage>(1020); formatter.Register<AssembliesMinimizedMessage>(1021); formatter.Register<UpdateCustomOutputpathMessage>(1022); formatter.Register<GoToFileAndLineMessage>(1023); formatter.Register<RequestVisualGraphMessage>(1024); formatter.Register<VisualGraphGeneratedMessage>(1025); formatter.Register<RequestRiskMetricsMessage>(1026); formatter.Register<RiskMetricGeneratedMessage>(1027); formatter.Register<RequestMessage<AssemblyPathRequest, AssemblyPathResponse>>(1028); formatter.Register<AssemblyPathResponse>(1029); formatter.Register<RequestMessage<IsSolutionInitializedRequest, IsSolutionInitializedResponse>>(1030); formatter.Register<IsSolutionInitializedResponse>(1031); formatter.Register<PartialRunMessage>(1032); formatter.Register<RealtimeChangeMessage>(1033); formatter.Register<ProfilerCompletedMessage>(1034); formatter.Register<ProfilerInitializedMessage>(1035); formatter.Register<RequestRuntimeTestInformationMessage>(1036); formatter.Register<TestInformationGeneratedMessage>(1037); formatter.Register<RealtimeChangeList>(1038); formatter.Register<OrderedBuildList>(1039); formatter.Register<RequestMessage<OrderedBuildList, OrderedBuildList>>(1040); formatter.Register<MinimizerInitializedMessage>(1041); formatter.Register<ProfiledTestRunStarted>(1042); formatter.Register<ProfilerLoadErrorOccurredMessage>(1043); formatter.Register<GetLastAffectedGraphMessage>(1044); formatter.Register<TestProfilerCorruptedMessage>(1045); formatter.Register<RequestProfiledGraphMessage>(1046); }
/// <summary> /// /// </summary> /// <param name="sactanet"></param> /// <param name="sectorUcs"></param> /// <param name="ask"></param> void SendSectorization(int sactanet, string[] sectorUcs, ushort UserOrg) { Debug.Assert(sactanet == 0 || sactanet == 1); CustomBinaryFormatter bf = new CustomBinaryFormatter(); MemoryStream ms = new MemoryStream(); SactaMsg msg = new SactaMsg(SactaMsg.MsgType.Sectorization, _SeqNum, _SectVersion, sectorUcs); bf.Serialize(ms, msg); byte[] data = ms.ToArray(); byte[] user = BitConverter.GetBytes(UserOrg); Array.Reverse(user); Array.Copy(user, 0, data, 6, 2); _Comm[sactanet].Send(_EndPoint[sactanet], data); MainForm.LogMethod("INFO", sactanet == 0 ? "SACTA1" : "SACTA2", String.Format("Enviando Sectorizacion V-{2} a SCV {0} ({1})", UserOrg, strSect(sectorUcs), _SectVersion)); }
/// <summary> /// /// </summary> void SendPresence() { CustomBinaryFormatter bf = new CustomBinaryFormatter(); MemoryStream ms = new MemoryStream(); SactaMsg msg = new SactaMsg(SactaMsg.MsgType.Presence, _SeqNum++); bf.Serialize(ms, msg); byte[] data = ms.ToArray(); foreach (string sUser in Settings.Default.ScvUsers) { byte[] user = BitConverter.GetBytes(UInt16.Parse(sUser)); Array.Reverse(user); Array.Copy(user, 0, data, 6, 2); _Comm[0].Send(_EndPoint[0], data); _Comm[1].Send(_EndPoint[1], data); } _LastPresenceSended = DateTime.Now; }
public void ChatRoomInfosSerializationTest() { var original = new[] { new ChatRoomInfo { IsPasswordProtected = true, Name = "r1" }, new ChatRoomInfo { IsPasswordProtected = false, Name = "r2" } }; // Serializing var serializedData = CustomBinaryFormatter.Serialize(original); Assert.NotNull(serializedData); Assert.True(serializedData.Length > 0); // Deserializing var reconstructed = CustomBinaryFormatter.Deserialize(serializedData, 0, serializedData.Length); CollectionAssert.AreEqual(original, reconstructed, new ChatRoomInfoComparer()); }
/// <summary> /// /// </summary> void SendInit() { CustomBinaryFormatter bf = new CustomBinaryFormatter(); MemoryStream ms = new MemoryStream(); SactaMsg msg = new SactaMsg(SactaMsg.MsgType.Init, SactaMsg.InitId); bf.Serialize(ms, msg); byte[] data = ms.ToArray(); foreach (string sUser in Settings.Default.ScvUsers) { MainForm.LogMethod("INFO", String.Format("Enviado MSG Init a SCV {0}", sUser)); byte[] user = BitConverter.GetBytes(UInt16.Parse(sUser)); Array.Reverse(user); Array.Copy(user, 0, data, 6, 2); _Comm[0].Send(_EndPoint[0], data); _Comm[1].Send(_EndPoint[1], data); } _SeqNum = 0; }
private static void Received(object model, BasicDeliverEventArgs ea) { var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { var body = ea.Body; var binaryFormatter = new CustomBinaryFormatter(); var sms = binaryFormatter.FromByteArray <SmsIsSendEvent>(body); var controller = new MessagesController(null); controller.SmsSend(sms); // processed successfully channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); } }
/// <summary> /// /// </summary> /// <param name="sectorUcs"></param> /// <param name="ask"></param> void SendSectorization(string[] sectorUcs, SactaMsg ask) { CustomBinaryFormatter bf = new CustomBinaryFormatter(); MemoryStream ms = new MemoryStream(); SactaMsg msg = new SactaMsg(SactaMsg.MsgType.Sectorization, _SeqNum++, _SectVersion++, sectorUcs); bf.Serialize(ms, msg); byte[] data = ms.ToArray(); if (ask != null) { MainForm.LogMethod("INFO", String.Format("Enviando Sectorizacion a SCV {0} ({1})", ask.UserOrg, strSect(sectorUcs))); byte[] user = BitConverter.GetBytes(ask.UserOrg); Array.Reverse(user); Array.Copy(user, 0, data, 6, 2); _Comm[0].Send(_EndPoint[0], data); _Comm[1].Send(_EndPoint[1], data); } else { foreach (string sUser in Settings.Default.ScvUsers) { MainForm.LogMethod("INFO", String.Format("Enviando Sectorizacion V-{0} a SCV {1} ({2})", ((SactaMsg.SectInfo)(msg.Info)).Version, sUser, strSect(sectorUcs))); byte[] user = BitConverter.GetBytes(UInt16.Parse(sUser)); Array.Reverse(user); Array.Copy(user, 0, data, 6, 2); _Comm[0].Send(_EndPoint[0], data); _Comm[1].Send(_EndPoint[1], data); } } }
/// <summary> /// /// </summary> void SendInit(int sactanet) { Debug.Assert(sactanet == 0 || sactanet == 1); CustomBinaryFormatter bf = new CustomBinaryFormatter(); MemoryStream ms = new MemoryStream(); SactaMsg msg = new SactaMsg(SactaMsg.MsgType.Init, SactaMsg.InitId); bf.Serialize(ms, msg); byte[] data = ms.ToArray(); foreach (string sUser in Settings.Default.ScvUsers) { byte[] user = BitConverter.GetBytes(UInt16.Parse(sUser)); Array.Reverse(user); Array.Copy(user, 0, data, 6, 2); _Comm[sactanet].Send(_EndPoint[sactanet], data); MainForm.LogMethod("INFO", sactanet == 0 ? "SACTA1" : "SACTA2", String.Format("Enviado MSG Init a SCV {0}", sUser)); //_Comm[1].Send(_EndPoint[1], data); //MainForm.LogMethod("INFO", "SACTA2", String.Format("Enviado MSG Init a SCV {0}", sUser)); } }
public async Task <string> SendMessage(MessageViewModel message) { var sendSmsEvent = new SendSmsEvent { Id = message.Id, Body = message.Body, From = message.From, To = message.To, Version = "v1.0" }; var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.ExchangeDeclare(exchange: "sms", type: ExchangeType.Direct); IBasicProperties props = channel.CreateBasicProperties(); props.CorrelationId = Guid.NewGuid().ToString(); props.ReplyTo = "receive"; var binaryFormatter = new CustomBinaryFormatter(); byte[] body = binaryFormatter.ToByteArray(sendSmsEvent); channel.BasicPublish(exchange: "sms", routingKey: "send", basicProperties: props, body: body); } return("Your message will be send soon"); }
public void SetUp() { _formatter = new CustomBinaryFormatter(); }
internal static void AddRecords(List <HistoryRecord> Records) { lock (_syncRoot) { using (FileStream dataIndexStream = new FileStream(GetFile(true, true), FileMode.OpenOrCreate)) { using (FileStream dataContentStream = new FileStream(GetFile(true, false), FileMode.OpenOrCreate)) { var historyFormatter = new CustomBinaryFormatter(dataIndexStream, dataContentStream); historyFormatter.Register <HistoryRecord>(1); historyFormatter.MoveToEnd(); var historyCount = historyFormatter.Count; Records.ForEach(r => { historyFormatter.Serialize <HistoryRecord>(r); }); historyFormatter.Flush(); using (FileStream dateIndexStream = new FileStream(GetFile(false, true), FileMode.OpenOrCreate)) { using (FileStream dateContentStream = new FileStream(GetFile(false, false), FileMode.OpenOrCreate)) { var dateFormatter = new CustomBinaryFormatter(dateIndexStream, dateContentStream); dateFormatter.Register <HistoryDate>(1); var dateCount = dateFormatter.Count; var today = DateTime.Now.Date.AddDays(1); var yesterday = DateTime.Now.Date; long todayIndex = -1; var foundYesterday = false; for (long i = 0; i < dateCount; i++) { var date = dateFormatter.Deserialize <HistoryDate>(false); if (DateTime.Parse(date.Date) == today) { todayIndex = i; } if (DateTime.Parse(date.Date) == yesterday) { foundYesterday = true; } } if (!foundYesterday) { dateFormatter.MoveToEnd(); dateFormatter.Serialize <HistoryDate>(new HistoryDate { Date = yesterday.ToString(), Index = historyCount }); } if (todayIndex != -1) { dateFormatter.MoveTo(todayIndex); dateFormatter.Serialize <HistoryDate>(new HistoryDate { Date = today.ToString(), Index = historyFormatter.Count }, true); } else { dateFormatter.MoveToEnd(); dateFormatter.Serialize <HistoryDate>(new HistoryDate { Date = today.ToString(), Index = historyFormatter.Count }); } dateFormatter.Flush(); } } } } } }
internal static List<HistoryRecord> GetRecords(ServerInfo server, bool isServer, DateTypes dateType, DateTime startDate) { var records = new List<HistoryRecord>(); var key = GetKey(server, isServer); using (var dateIndexStream = new FileStream(GetFile(false, true), FileMode.OpenOrCreate)) { using (var dateContentStream = new FileStream(GetFile(false, false), FileMode.OpenOrCreate)) { var dateFormatter = new CustomBinaryFormatter(dateIndexStream, dateContentStream); dateFormatter.Register<HistoryDate>(1); var endDate = DateTime.Now.Date; var samplingSpan = 1; switch (dateType) { case DateTypes.Hour: endDate = startDate.AddDays(1); samplingSpan = 1; break; case DateTypes.Day: endDate = startDate.AddDays(1); samplingSpan = 24; break; case DateTypes.Week: endDate = startDate.AddDays(7); samplingSpan = 7 * 24; break; case DateTypes.Month: endDate = startDate.AddMonths(1); samplingSpan = 31 * 24; break; case DateTypes.Year: endDate = startDate.AddYears(1); samplingSpan = 365 * 24; break; default: break; } var count = dateFormatter.Count; Debug.WriteLine("all date count:" + count); Debug.WriteLine("start date:" + startDate); var dates = new List<HistoryDate>(); for (long i = 0; i < count; i++) { var date = dateFormatter.Deserialize<HistoryDate>(false); var dateTime = DateTime.Parse(date.Date); Debug.WriteLine("current date:" + dateTime); if (startDate.Date <= dateTime && dateTime <= endDate) dates.Add(date); } Debug.WriteLine("valid date count:" + dates.Count); if (dates.Count > 0) { var start = dates.Aggregate((d1, d2) => DateTime.Parse(d1.Date) < DateTime.Parse(d2.Date) ? d1 : d2); var end = dates.Aggregate((d1, d2) => DateTime.Parse(d1.Date) > DateTime.Parse(d2.Date) ? d1 : d2); using (var dataIndexStream = new FileStream(GetFile(true, true), FileMode.OpenOrCreate)) { using (var dataContentStream = new FileStream(GetFile(true, false), FileMode.OpenOrCreate)) { var historyFormatter = new CustomBinaryFormatter(dataIndexStream, dataContentStream); historyFormatter.Register<HistoryRecord>(1); for (var i = start.Index; i < end.Index; i += samplingSpan) { historyFormatter.MoveTo(i); var record = historyFormatter.Deserialize<HistoryRecord>(false); if (record.Key == key) records.Add(record); } historyFormatter.Close(); dataContentStream.Close(); } dataIndexStream.Close(); } } dateFormatter.Close(); dateContentStream.Close(); } dateIndexStream.Close(); } return records; }
internal static void AddRecords(List<HistoryRecord> records) { lock (SyncRoot) { using (var dataIndexStream = new FileStream(GetFile(true, true), FileMode.OpenOrCreate)) { using (var dataContentStream = new FileStream(GetFile(true, false), FileMode.OpenOrCreate)) { var historyFormatter = new CustomBinaryFormatter(dataIndexStream, dataContentStream); historyFormatter.Register<HistoryRecord>(1); historyFormatter.MoveToEnd(); var historyCount = historyFormatter.Count; records.ForEach(r => { historyFormatter.Serialize<HistoryRecord>(r); }); historyFormatter.Flush(); using (var dateIndexStream = new FileStream(GetFile(false, true), FileMode.OpenOrCreate)) { using (var dateContentStream = new FileStream(GetFile(false, false), FileMode.OpenOrCreate)) { var dateFormatter = new CustomBinaryFormatter(dateIndexStream, dateContentStream); dateFormatter.Register<HistoryDate>(1); var dateCount = dateFormatter.Count; var today = DateTime.Now.Date.AddDays(1); var yesterday = DateTime.Now.Date; long todayIndex = -1; var foundYesterday = false; for (long i = 0; i < dateCount; i++) { var date = dateFormatter.Deserialize<HistoryDate>(false); if (DateTime.Parse(date.Date) == today) todayIndex = i; if (DateTime.Parse(date.Date) == yesterday) foundYesterday = true; } if (!foundYesterday) { dateFormatter.MoveToEnd(); dateFormatter.Serialize<HistoryDate>(new HistoryDate { Date = yesterday.ToString(), Index = historyCount }); } if (todayIndex != -1) { dateFormatter.MoveTo(todayIndex); dateFormatter.Serialize<HistoryDate>(new HistoryDate { Date = today.ToString(), Index = historyFormatter.Count }, true); } else { dateFormatter.MoveToEnd(); dateFormatter.Serialize<HistoryDate>(new HistoryDate { Date = today.ToString(), Index = historyFormatter.Count }); } dateFormatter.Flush(); } } } } } }
public TcpServer(IServerFeedbackProvider feedbackProvider) { _formatter = new CustomBinaryFormatter(); MessageInitializer.RegisterMessagesWithSerializer(_formatter); _feedbackProvider = feedbackProvider; }
internal static List <HistoryRecord> GetRecords(ServerInfo Server, bool IsServer, DateTypes DateType, DateTime StartDate) { var records = new List <HistoryRecord>(); var key = GetKey(Server, IsServer); using (FileStream dateIndexStream = new FileStream(GetFile(false, true), FileMode.OpenOrCreate)) { using (FileStream dateContentStream = new FileStream(GetFile(false, false), FileMode.OpenOrCreate)) { var dateFormatter = new CustomBinaryFormatter(dateIndexStream, dateContentStream); dateFormatter.Register <HistoryDate>(1); var endDate = DateTime.Now.Date; var samplingSpan = 1; switch (DateType) { case DateTypes.Hour: endDate = StartDate.AddDays(1); samplingSpan = 1; break; case DateTypes.Day: endDate = StartDate.AddDays(1); samplingSpan = 24; break; case DateTypes.Week: endDate = StartDate.AddDays(7); samplingSpan = 7 * 24; break; case DateTypes.Month: endDate = StartDate.AddMonths(1); samplingSpan = 31 * 24; break; case DateTypes.Year: endDate = StartDate.AddYears(1); samplingSpan = 365 * 24; break; default: break; } var count = dateFormatter.Count; System.Diagnostics.Debug.WriteLine("all date count:" + count); System.Diagnostics.Debug.WriteLine("start date:" + StartDate); var dates = new List <HistoryDate>(); for (long i = 0; i < count; i++) { var date = dateFormatter.Deserialize <HistoryDate>(false); var dateTime = DateTime.Parse(date.Date); System.Diagnostics.Debug.WriteLine("current date:" + dateTime); if (StartDate.Date <= dateTime && dateTime <= endDate) { dates.Add(date); } } System.Diagnostics.Debug.WriteLine("valid date count:" + dates.Count); if (dates.Count > 0) { var start = dates.Aggregate((d1, d2) => DateTime.Parse(d1.Date) < DateTime.Parse(d2.Date) ? d1 : d2); var end = dates.Aggregate((d1, d2) => DateTime.Parse(d1.Date) > DateTime.Parse(d2.Date) ? d1 : d2); using (FileStream dataIndexStream = new FileStream(GetFile(true, true), FileMode.OpenOrCreate)) { using (FileStream dataContentStream = new FileStream(GetFile(true, false), FileMode.OpenOrCreate)) { var historyFormatter = new CustomBinaryFormatter(dataIndexStream, dataContentStream); historyFormatter.Register <HistoryRecord>(1); for (long i = start.Index; i < end.Index; i += samplingSpan) { historyFormatter.MoveTo(i); var record = historyFormatter.Deserialize <HistoryRecord>(false); if (record.Key == key) { records.Add(record); } } historyFormatter.Close(); dataContentStream.Close(); } dataIndexStream.Close(); } } dateFormatter.Close(); dateContentStream.Close(); } dateIndexStream.Close(); } return(records); }