/// <inheritdoc /> public Event Deserialize(byte[] dataBytes) { var unpacked = MessagePackSerializer.Deserialize <Dictionary <string, byte[]> >(dataBytes); var @event = ObjectDeserializer.AsString(unpacked[nameof(Event.Type)]); var id = ObjectDeserializer.AsGuid(unpacked[nameof(Event.Id)]); var timestamp = ObjectDeserializer.AsZonedDateTime(unpacked[nameof(Event.Timestamp)]); switch (@event) { case nameof(AccountStateEvent): var currency = ObjectDeserializer.AsEnum <Currency>(unpacked[nameof(AccountStateEvent.Currency)]); return(new AccountStateEvent( this.identifierCache.AccountId(unpacked), currency, ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.CashBalance)], currency), ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.CashStartDay)], currency), ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.CashActivityDay)], currency), ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.MarginUsedLiquidation)], currency), ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.MarginUsedMaintenance)], currency), ObjectDeserializer.AsDecimal(unpacked[nameof(AccountStateEvent.MarginRatio)]), ObjectDeserializer.AsString(unpacked[nameof(AccountStateEvent.MarginCallStatus)]), id, timestamp)); case nameof(OrderInitialized): return(new OrderInitialized( ObjectDeserializer.AsOrderId(unpacked), this.identifierCache.Symbol(unpacked), ObjectDeserializer.AsEnum <OrderSide>(unpacked[nameof(OrderInitialized.OrderSide)]), ObjectDeserializer.AsEnum <OrderType>(unpacked[nameof(OrderInitialized.OrderType)]), ObjectDeserializer.AsQuantity(unpacked[nameof(OrderInitialized.Quantity)]), ObjectDeserializer.AsNullablePrice(unpacked[nameof(OrderInitialized.Price)]), ObjectDeserializer.AsEnum <TimeInForce>(unpacked[nameof(OrderInitialized.TimeInForce)]), ObjectDeserializer.AsNullableZonedDateTime(unpacked[nameof(OrderInitialized.ExpireTime)]), id, timestamp)); case nameof(OrderInvalid): return(new OrderInvalid( ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsString(unpacked[nameof(OrderInvalid.InvalidReason)]), id, timestamp)); case nameof(OrderDenied): return(new OrderDenied( ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsString(unpacked[nameof(OrderDenied.DeniedReason)]), id, timestamp)); case nameof(OrderSubmitted): return(new OrderSubmitted( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderSubmitted.SubmittedTime)]), id, timestamp)); case nameof(OrderAccepted): return(new OrderAccepted( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsOrderIdBroker(unpacked), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderAccepted.AcceptedTime)]), id, timestamp)); case nameof(OrderRejected): return(new OrderRejected( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderRejected.RejectedTime)]), ObjectDeserializer.AsString(unpacked[nameof(OrderRejected.RejectedReason)]), id, timestamp)); case nameof(OrderWorking): return(new OrderWorking( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsOrderIdBroker(unpacked), this.identifierCache.Symbol(unpacked), ObjectDeserializer.AsEnum <OrderSide>(unpacked[nameof(OrderWorking.OrderSide)]), ObjectDeserializer.AsEnum <OrderType>(unpacked[nameof(OrderWorking.OrderType)]), ObjectDeserializer.AsQuantity(unpacked[nameof(OrderWorking.Quantity)]), ObjectDeserializer.AsPrice(unpacked[nameof(OrderWorking.Price)]), ObjectDeserializer.AsEnum <TimeInForce>(unpacked[nameof(OrderWorking.TimeInForce)]), ObjectDeserializer.AsNullableZonedDateTime(unpacked[nameof(OrderWorking.ExpireTime)]), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderWorking.WorkingTime)]), id, timestamp)); case nameof(OrderCancelled): return(new OrderCancelled( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderCancelled.CancelledTime)]), id, timestamp)); case nameof(OrderCancelReject): return(new OrderCancelReject( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderCancelReject.RejectedTime)]), ObjectDeserializer.AsString(unpacked[nameof(OrderCancelReject.RejectedResponseTo)]), ObjectDeserializer.AsString(unpacked[nameof(OrderCancelReject.RejectedReason)]), id, timestamp)); case nameof(OrderModified): return(new OrderModified( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsOrderIdBroker(unpacked), ObjectDeserializer.AsQuantity(unpacked[nameof(OrderModified.ModifiedQuantity)]), ObjectDeserializer.AsPrice(unpacked[nameof(OrderModified.ModifiedPrice)]), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderModified.ModifiedTime)]), id, timestamp)); case nameof(OrderExpired): return(new OrderExpired( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderExpired.ExpiredTime)]), id, timestamp)); case nameof(OrderPartiallyFilled): return(new OrderPartiallyFilled( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsExecutionId(unpacked), ObjectDeserializer.AsPositionIdBroker(unpacked), this.identifierCache.Symbol(unpacked), ObjectDeserializer.AsEnum <OrderSide>(unpacked[nameof(OrderPartiallyFilled.OrderSide)]), ObjectDeserializer.AsQuantity(unpacked[nameof(OrderPartiallyFilled.FilledQuantity)]), ObjectDeserializer.AsQuantity(unpacked[nameof(OrderPartiallyFilled.LeavesQuantity)]), ObjectDeserializer.AsPrice(unpacked[nameof(OrderPartiallyFilled.AveragePrice)]), ObjectDeserializer.AsEnum <Currency>(unpacked[nameof(OrderPartiallyFilled.Currency)]), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderPartiallyFilled.ExecutionTime)]), id, timestamp)); case nameof(OrderFilled): return(new OrderFilled( this.identifierCache.AccountId(unpacked), ObjectDeserializer.AsOrderId(unpacked), ObjectDeserializer.AsExecutionId(unpacked), ObjectDeserializer.AsPositionIdBroker(unpacked), this.identifierCache.Symbol(unpacked), ObjectDeserializer.AsEnum <OrderSide>(unpacked[nameof(OrderFilled.OrderSide)]), ObjectDeserializer.AsQuantity(unpacked[nameof(OrderFilled.FilledQuantity)]), ObjectDeserializer.AsPrice(unpacked[nameof(OrderFilled.AveragePrice)]), ObjectDeserializer.AsEnum <Currency>(unpacked[nameof(OrderFilled.Currency)]), ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderFilled.ExecutionTime)]), id, timestamp)); default: throw ExceptionFactory.InvalidSwitchArgument(@event, nameof(@event)); } }