← Atrás

4.1.3 Перестала работать загрузка параметров стратегии

Загружаю параметры стратегии так:

 
if (System.IO.File.Exists("settings.xml")) {
  //Загрузка настроек стратегии из существующего конфигурационного файла
  var settingsStorage = new XmlSerializer<SettingsStorage>().Deserialize("settings.xml");
}

В строке 3 выдается исключение:

System.ArgumentNullException не обработано Message=Значение не может быть неопределенным. Имя параметра: key Source=mscorlib ParamName=key StackTrace: в System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) в System.Collections.Generic.Dictionary2.Add(TKey key, TValue value) в Ecng.Collections.SynchronizedDictionary2.Add(TKey key, TValue value) в Ecng.Collections.SynchronizedDictionary2.Add(KeyValuePair2 item) в Ecng.Serialization.CollectionEntityFactory2.CreateEntity(ISerializer serializer, SerializationItemCollection source) в Ecng.Serialization.EntityFactory1.CreateObject(ISerializer serializer, SerializationItemCollection source) в Ecng.Serialization.Serializer1.Deserialize(SerializationItemCollection source, FieldList fields) в Ecng.Serialization.Serializer1.Deserialize(Stream stream, FieldList fields) в Ecng.Serialization.Serializer1.Deserialize(Stream stream) в Ecng.Serialization.Serializer`1.Deserialize(String fileName) в 4.1.2 все работало.

¿Le resultó útil este tema?

Compartir tema

Comentarios (8)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

Mikhail Sukhov
Mikhail Sukhov

Файл сохранен предыдущей версией?

PavelAd
PavelAd Autor

Mikhail Sukhov: Файл сохранен предыдущей версией?

Да. Направление понятно

PavelAd
PavelAd Autor

Чтобы получить файл настроек в новом формате вызываю как и раньше:


var StopLossSize = new Unit(200, UnitTypes.Limit);
....
settings.SetValue("StopLossSize", StopLossSize);
new XmlSerializer<SettingsStorage>().Serialize(settings, "settings_template.xml");

и получаю исключение:

System.Reflection.TargetInvocationException не обработано пользовательским кодом Message=Адресат вызова создал исключение. Source=mscorlib StackTrace: в System.RuntimeMethodHandle._InvokeConstructor(IRuntimeMethodInfo method, Object[] args, SignatureStruct& signature, RuntimeType declaringType) в System.RuntimeMethodHandle.InvokeConstructor(IRuntimeMethodInfo method, Object[] args, SignatureStruct signature, RuntimeType declaringType) в System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) в System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) в System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) в System.Activator.CreateInstance(Type type, Object[] args) в Ecng.Common.TypeHelper.CreateInstanceArgs(Type type, Object[] args) в Ecng.Serialization.ReflectionFieldFactoryAttribute.CreateFactory(Field field) в Ecng.Serialization.TypeSchemaFactory.<>c__DisplayClass11.<CreateSchema>b__d(FieldFactoryAttribute a) в System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() в System.Collections.Generic.List1..ctor(IEnumerable1 collection) в System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) в Ecng.Serialization.TypeSchemaFactory.CreateSchema(Type entityType) в Ecng.Serialization.SchemaManager.<>c__DisplayClass5.<GetSchema>b__4(Type key) в Ecng.Collections.CollectionHelper.SafeAdd[TKey,TValue](IDictionary2 dictionary, TKey key, Func2 handler, Boolean& isNew) в Ecng.Collections.CollectionHelper.SafeAdd[TKey,TValue](IDictionary2 dictionary, TKey key, Func2 handler) в Ecng.Serialization.SchemaManager.GetSchema(Type entityType, SchemaFactory factory) в Ecng.Serialization.SchemaManager.GetSchema(Type entityType) в Ecng.Serialization.SchemaManager.GetSchemaTEntity в Ecng.Serialization.Serializer1.get_Schema() в Ecng.Serialization.Serializer1.GetFields() в Ecng.Serialization.Serializer1.Serialize(T graph, SerializationItemCollection source) в Ecng.Serialization.Serializer1.Ecng.Serialization.ISerializer.Serialize(Object graph, SerializationItemCollection source) в Ecng.Serialization.InnerSchemaFieldFactory1.OnCreateSource(ISerializer serializer, TEntity instance) в Ecng.Serialization.FieldFactory2.OnCreateSource(ISerializer serializer, Object instance) в Ecng.Serialization.DynamicFieldFactory.OnCreateSource(ISerializer serializer, Object instance) в Ecng.Serialization.FieldFactory2.OnCreateSource(ISerializer serializer, Object instance) в Ecng.Serialization.FieldFactory.CreateSource(ISerializer serializer, Object instance) в Ecng.Serialization.Serializer1.Serialize(T graph, FieldList fields, SerializationItemCollection source) в Ecng.Serialization.Serializer1.Serialize(T graph, SerializationItemCollection source) в Ecng.Serialization.RealCollectionFieldFactory2.OnCreateSource(ISerializer serializer, TCollection instance) в Ecng.Serialization.FieldFactory2.OnCreateSource(ISerializer serializer, Object instance) в Ecng.Serialization.FieldFactory.CreateSource(ISerializer serializer, Object instance) в Ecng.Serialization.Serializer1.Serialize(T graph, FieldList fields, SerializationItemCollection source) в Ecng.Serialization.Serializer1.Serialize(T graph, FieldList fields, Stream stream) в Ecng.Serialization.Serializer1.Serialize(T graph, Stream stream) в Ecng.Serialization.Serializer1.Serialize(T graph) в Ecng.Serialization.Serializer1.Serialize(T graph, String fileName) в TradeStrategy.TresureStrategy.Save(SettingsStorage settings) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 2004 в TradeStrategy.TresureStrategy.OnStopped() в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 367 в StockSharp.Algo.Strategies.Strategy.#=q9ZjYAh_tjTRiPKXRpMmVPaf8lHMr7XpjKfF8P_SBSxY=(ProcessStates #=qK93m3AC1JAhKyhuxNljMUw==) InnerException: Microsoft.Practices.ServiceLocation.ActivationException Message=Activation error occured while trying to get instance of type IStorage, key "" Source=Microsoft.Practices.ServiceLocation StackTrace: в Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) в Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstanceTService в Ecng.Configuration.ConfigManager.GetService() в Ecng.Serialization.RelationFieldFactory2..ctor(Field field, Int32 order) в Ecng.Serialization.RelationSingleFieldFactory2..ctor(Field field, Int32 order) InnerException: Microsoft.Practices.Unity.ResolutionFailedException Message=Resolution of the dependency failed, type = "Ecng.Serialization.IStorage", name = "(none)". Exception occurred while: while resolving. Exception is: InvalidOperationException - The current type, Ecng.Serialization.IStorage, is an interface and cannot be constructed. Are you missing a type mapping?

At the time of the exception, the container was:

Resolving Ecng.Serialization.IStorage,(none)

        Source=Microsoft.Practices.Unity
        TypeRequested=IStorage
        StackTrace:
             в Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides)
             в Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name, IEnumerable`1 resolverOverrides)
             в Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides)
             в Microsoft.Practices.Unity.UnityServiceLocator.DoGetInstance(Type serviceType, String key)
             в Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key)
        InnerException: System.InvalidOperationException
             Message=The current type, Ecng.Serialization.IStorage, is an interface and cannot be constructed. Are you missing a type mapping?
             Source=Microsoft.Practices.Unity
             StackTrace:
                  в Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context)
                  в BuildUp_Ecng.Serialization.IStorage(IBuilderContext )
                  в Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)
                  в Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)
                  в Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
                  в Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides)
             InnerException:

Исключение выходит только в случае сохранения параметров типа Unit

PavelAd
PavelAd Autor

Ошибку повторил используя пример SampleHistoryTesting добавив сериализацию объекта Unit.

PavelAd
PavelAd Autor

Измененный пример SampleHistoryTesting где повторяется ошибка

PavelAd
PavelAd Autor

Ошибка подтверждается7

Mikhail Sukhov
Mikhail Sukhov

PavelAd: Ошибка подтверждается7

Unit так просто не сохранить в файл. Там нужно регистрировать загрузчик инструментов для инициализации Unit.Security

PavelAd
PavelAd Autor

Mikhail Sukhov: Unit так просто не сохранить в файл. Там нужно регистрировать загрузчик инструментов для инициализации Unit.Security

И как тогда быть? Возожно привести пример такого загрузчика? Замечу еще раз что в 4.1.2 в старом формате все выгружалось, например:

<StopLoss type="StockSharp.BusinessEntities.Unit, StockSharp.BusinessEntities, Version=4.1.2.0, Culture=neutral, PublicKeyToken=null"> <Security hasValue="false" /> <Type>0</Type> <Value>120</Value> </StopLoss>

В новом формате сложные типы (например индикаторы) выгружаются без проблем, например EMA:

<KeyValuePairBeginStringAndObjectEnd> <key>MAHigh</key> <value> <Type type="string">StockSharp.Algo.Indicators.ExponentialMovingAverage, StockSharp.Algo.Indicators, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</Type> <Value type="StockSharp.Algo.Indicators.ExponentialMovingAverage, StockSharp.Algo.Indicators, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> <Length>10</Length> <Name>ExponentialMovingAverage</Name> </Value> </value> </KeyValuePairBeginStringAndObjectEnd>

почему Unit не выгружается по аналогии:

<KeyValuePairBeginStringAndObjectEnd> <key>StopLoss</key> <value> <Type type="string">StockSharp.BusinessEntities.Unit, StockSharp.BusinessEntities, Version=4.1.4.0, Culture=neutral, PublicKeyToken=null</Type> <Value type="StockSharp.BusinessEntities.Unit, StockSharp.BusinessEntities, Version=4.1.4.0, Culture=neutral, PublicKeyToken=null"> <Security hasValue="false" /> <Type>0</Type> <Value>120</Value> </Value> </value> </KeyValuePairBeginStringAndObjectEnd>