Parameter Serializers¶
The element parameterSerializers is used to de-serialize textual values used for type constructor parameters and property values, into objects of specific types.
Here is an example of parameterSerializers element.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <assemblies>
<assembly name="OROptimizer.Shared" alias="oroptimizer_shared" />
<assembly name="TestProjects.TestPluginAssembly1" alias="pluginassm1" plugin="Plugin1" />
<assembly name="TestProjects.TestPluginAssembly2" alias="pluginassm1" plugin="Plugin2" />
<!--Some more assemblies here...-->
</assemblies>
<parameterSerializers
serializerAggregatorType="OROptimizer.Serializer.TypeBasedSimpleSerializerAggregator"
assembly="oroptimizer_shared">
<!--
Use parameters element to specify constructor parameters,
if the type specified in 'serializerAggregatorType' attribute
has non-default constructor.
-->
<!--<parameters>
</parameters>-->
<serializers>
<parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerDouble"
assembly="oroptimizer_shared" />
<parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerLong"
assembly="oroptimizer_shared" />
<parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerInt"
assembly="oroptimizer_shared" />
<parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerShort"
assembly="oroptimizer_shared" />
<parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerByte"
assembly="oroptimizer_shared" />
<parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerBoolean"
assembly="oroptimizer_shared" />
<parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerDateTime"
assembly="oroptimizer_shared" />
<parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerString"
assembly="oroptimizer_shared" />
<parameterSerializer type="TestPluginAssembly1.Implementations.DoorSerializer"
assembly="pluginassm1" />
<parameterSerializer type="TestPluginAssembly2.Implementations.WheelSerializer"
assembly="pluginassm2">
<!--
Use parameters element to specify constructor parameters,
if the type specified in 'type' attribute has non-default constructor.
-->
<!--<parameters>
</parameters>-->
</parameterSerializer>
</serializers>
</parameterSerializers>
|
The value of attribute serializerAggregatorType in element parameterSerializers should be full name of a type that implements the interface OROptimizer.Serializer.ITypeBasedSimpleSerializerAggregator in assembly OROptimizer.Shared.dll (the assembly is available in Nuget package OROptimizer.Shared).
The default implementation of this interface is class OROptimizer.Serializer.TypeBasedSimpleSerializerAggregator in assembly OROptimizer.Shared.dll.
Attribute assembly is an assembly alias, that contains the type specified in attribute serializerAggregatorType (the assembly should be declared in some element /iocConfiguration/assemblies/assembly).
Element parameters specifies values of constructor parameters for the type specified in attribute serializerAggregatorType (for details on constructor parameters reference Constructor Parameters).
Element serializers lists the registered serializers using parameterSerializer elements. Each parameterSerializer element registers a serializer for specific type (see the Element parameterSerializer section below).
Note
Some parameter serializers are provided by default, even if we do not list them under element parameterSerializers/serializers. Examples are serializers for some common types, such as parameter serializers for System.Int32, and System.Double, which are OROptimizer.Serializer.TypeBasedSimpleSerializerInt and OROptimizer.Serializer.TypeBasedSimpleSerializerDouble.
Element parameterSerializer¶
The element parameterSerializer registers a serializer for specific type. This element has two attributes, type and assembly, which are used to specify the full type name and the assembly for a serializer class that implements interface OROptimizer.Serializer.ITypeBasedSimpleSerializer.
Here is the definition of interface OROptimizer.Serializer.ITypeBasedSimpleSerializer:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | namespace OROptimizer.Serializer
{
/// <summary>
/// A simple serializer that serializes/de-serializes objects to and from strings.
/// The serialized string does not have any information about the type, so specific implementation de-serializes
/// specific type.
/// For example integer value 3 will be de-serialized from "3".
/// </summary>
public interface ITypeBasedSimpleSerializer
{
Type SerializedType { get; }
bool TryDeserialize(string valueToDeserialize, out object deserializedValue);
bool TrySerialize(object valueToSerialize, out string serializedValue);
}
}
|
Note
The property OROptimizer.Serializer.ITypeBasedSimpleSerializer.SerializedType is used to pick a deserializer type from the serializers registered in element parameterSerializers.
Example 1¶
Note
Refer to Constructor Parameters for more details on parameters element to specify constructor parameter values in configuration file.
The selfBoundService element below is a definition of self-bound service for type DynamicallyLoadedAssembly1.Implementations.SelfBoundService1 from configuration file.
<selfBoundService type="DynamicallyLoadedAssembly1.Implementations.SelfBoundService1"
assembly="dynamic1"
scope="singleton">
<parameters>
<int32 name="param1" value="14" />
<double name="param2" value="15.3" />
<injectedObject name="param3" type="DynamicallyLoadedAssembly1.Interfaces.IInterface1"
assembly="dynamic1" />
</parameters>
</selfBoundService>
The type DynamicallyLoadedAssembly1.Implementations.SelfBoundService1 has a constructor with three parameters of types System.Int32, System.Double, and DynamicallyLoadedAssembly1.Interfaces.IInterface1.
- Since there is a parameterSerializer element (see example of parameterSerializers element above) for type System.Int32 (i.e., OROptimizer.Serializer.TypeBasedSimpleSerializerInt), which de-serializes textual values into System.Int32 values, IoC.Configuration will use OROptimizer.Serializer.TypeBasedSimpleSerializerInt to de-serialze the textual value “14” into a System.Int32 value for the constructor parameter param1.
- Since there is a parameterSerializer element (see example of parameterSerializers element above) for type System.Double (i.e., OROptimizer.Serializer.TypeBasedSimpleSerializerDouble), which de-serializes textual values into System.Double values, IoC.Configuration will use OROptimizer.Serializer.TypeBasedSimpleSerializerDouble to de-serialze the textual value “15.3” into an System.Double value for the constructor parameter param2.
- The constructor parameter param3 will be injected into constructor of DynamicallyLoadedAssembly1.Implementations.SelfBoundService1, using dependency injection mechanism, since injectedObject element is used for this parameter.
Example 2¶
Note
Refer to Constructor Parameters for more details on parameters element to specify constructor parameter values in configuration file.
The service element below defines type bindings for interface TestPluginAssembly1.Interfaces.IRoom.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <service type="TestPluginAssembly1.Interfaces.IRoom" assembly="pluginassm1">
<implementation type="TestPluginAssembly1.Implementations.Room"
assembly="pluginassm1"
scope="transient">
<parameters>
<object name="door1" type="TestPluginAssembly1.Interfaces.IDoor"
assembly="pluginassm1"
value="5,185.1" />
<injectedObject name="door2" type="TestPluginAssembly1.Interfaces.IDoor"
assembly="pluginassm1" />
</parameters>
<injectedProperties>
<object name="Door2" type="TestPluginAssembly1.Interfaces.IDoor"
assembly="pluginassm1"
value="7,187.3" />
</injectedProperties>
</implementation>
</service>
|
The constructor of type TestPluginAssembly1.Implementations.Room in element implementation has two constructor parameters named door1 and door2, both of type TestPluginAssembly1.Interfaces.IDoor.
- Since there is a parameterSerializer element (see example of parameterSerializers element above) for type TestPluginAssembly1.Implementations.DoorSerializer, which de-serializes textual values into TestPluginAssembly1.Interfaces.IDoor values, IoC.Configuration will use TestPluginAssembly1.Implementations.DoorSerializer to de-serialze the textual value “5,185.1” into a TestPluginAssembly1.Interfaces.IDoor value to use for constructor parameter door1.
- The constructor parameter door2 will be injected into constructor of TestPluginAssembly1.Implementations.Room, using dependency injection mechanism, since injectedObject element is used for this parameter.
- Property TestPluginAssembly1.Implementations.Room.Door2 has a setter, and is of type TestPluginAssembly1.Interfaces.IDoor as well, therefore IoC.Configuration will use TestPluginAssembly1.Implementations.DoorSerializer as well, to de-serialze the textual value “7,187.3” into a TestPluginAssembly1.Interfaces.IDoor value and to assign this value to a property TestPluginAssembly1.Implementations.Room.Door2 in bound object of type TestPluginAssembly1.Implementations.Room.