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   <assemblies>
 2       <assembly name="OROptimizer.Shared" alias="oroptimizer_shared" />
 3       <assembly name="TestProjects.TestPluginAssembly1" alias="pluginassm1" plugin="Plugin1" />
 4       <assembly name="TestProjects.TestPluginAssembly2" alias="pluginassm1" plugin="Plugin2" />
 5       <!--Some more assemblies here...-->
 6   </assemblies>
 7
 8   <parameterSerializers
 9               serializerAggregatorType="OROptimizer.Serializer.TypeBasedSimpleSerializerAggregator"
10               assembly="oroptimizer_shared">
11       <!--
12       Use parameters element to specify constructor parameters,
13       if the type specified in 'serializerAggregatorType' attribute
14       has non-default constructor.
15       -->
16       <!--<parameters>
17       </parameters>-->
18       <serializers>
19           <parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerDouble"
20                                assembly="oroptimizer_shared" />
21           <parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerLong"
22                                assembly="oroptimizer_shared" />
23           <parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerInt"
24                                assembly="oroptimizer_shared" />
25           <parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerShort"
26                                assembly="oroptimizer_shared" />
27           <parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerByte"
28                                assembly="oroptimizer_shared" />
29           <parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerBoolean"
30                                assembly="oroptimizer_shared" />
31           <parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerDateTime"
32                                assembly="oroptimizer_shared" />
33           <parameterSerializer type="OROptimizer.Serializer.TypeBasedSimpleSerializerString"
34                                assembly="oroptimizer_shared" />
35
36           <parameterSerializer type="TestPluginAssembly1.Implementations.DoorSerializer"
37                                assembly="pluginassm1" />
38           <parameterSerializer type="TestPluginAssembly2.Implementations.WheelSerializer"
39                                assembly="pluginassm2">
40               <!--
41               Use parameters element to specify constructor parameters,
42               if the type specified in 'type' attribute has non-default constructor.
43               -->
44               <!--<parameters>
45               </parameters>-->
46           </parameterSerializer>
47       </serializers>
48   </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   namespace OROptimizer.Serializer
 2   {
 3       /// <summary>
 4       ///     A simple serializer that serializes/de-serializes objects to and from strings.
 5       ///     The serialized string does not have any information about the type, so specific implementation de-serializes
 6       ///     specific type.
 7       ///     For example integer value 3 will be de-serialized from "3".
 8       /// </summary>
 9       public interface ITypeBasedSimpleSerializer
10       {
11           Type SerializedType { get; }
12           bool TryDeserialize(string valueToDeserialize, out object deserializedValue);
13           bool TrySerialize(object valueToSerialize, out string serializedValue);
14       }
15   }

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    <service type="TestPluginAssembly1.Interfaces.IRoom" assembly="pluginassm1">
 2        <implementation type="TestPluginAssembly1.Implementations.Room"
 3                        assembly="pluginassm1"
 4                        scope="transient">
 5            <parameters>
 6                <object name="door1" type="TestPluginAssembly1.Interfaces.IDoor"
 7                        assembly="pluginassm1"
 8                        value="5,185.1" />
 9                <injectedObject name="door2" type="TestPluginAssembly1.Interfaces.IDoor"
10                                assembly="pluginassm1" />
11            </parameters>
12            <injectedProperties>
13                <object name="Door2" type="TestPluginAssembly1.Interfaces.IDoor"
14                        assembly="pluginassm1"
15                        value="7,187.3" />
16            </injectedProperties>
17        </implementation>
18    </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.