private static void TestMissingFieldCore(SerializationMethod method, EmitterFlavor flavor)
        {
            var context = new SerializationContext()
            {
                SerializationMethod = method, EmitterFlavor = flavor
            };

            var serializer = MessagePackSerializer.Create <VersioningTestTarget>(context);

            using (var stream = new MemoryStream())
            {
                if (method == SerializationMethod.Array)
                {
                    stream.Write(new byte[] { 0x91, 0x1 });
                }
                else
                {
                    var packer = Packer.Create(stream, false);
                    packer.PackMapHeader(1);
                    packer.Pack("Field1");
                    packer.Pack(1);
                }

                stream.Position = 0;

                var result = serializer.Unpack(stream);

                Assert.That(result.Field1, Is.EqualTo(1));
                Assert.That(result.Field2, Is.EqualTo(0));
                Assert.That(result.Field3, Is.Null);
            }
        }
        private static void TestFieldSwappedCore(EmitterFlavor flavor)
        {
            var context = new SerializationContext()
            {
                SerializationMethod = SerializationMethod.Map, EmitterFlavor = flavor
            };

            var serializer = MessagePackSerializer.Create <VersioningTestTarget>(context);

            using (var stream = new MemoryStream())
            {
                var packer = Packer.Create(stream, false);
                packer.PackMapHeader(4);
                packer.Pack("Field1");
                packer.Pack(1);
                packer.Pack("Field2");
                packer.Pack(-1);
                packer.Pack("Extra");
                packer.Pack(2);                   // Issue6

                stream.Position = 0;

                var result = serializer.Unpack(stream);

                Assert.That(result.Field1, Is.EqualTo(1));
                Assert.That(result.Field2, Is.EqualTo(-1));
                Assert.That(result.Field3, Is.Null);
            }
        }
Example #3
0
        public static SerializerEmitter CreateTupleSerializerCore(Type tupleType, EmitterFlavor emitterFlavor)
        {
            Contract.Requires(tupleType != null);
            Contract.Ensures(Contract.Result <SerializerEmitter>() != null);

            var emitter   = SerializationMethodGeneratorManager.Get().CreateEmitter(tupleType, emitterFlavor);
            var itemTypes = TupleItems.GetTupleItemTypes(tupleType);

            CreateTuplePack(
                emitter,
                tupleType,
                itemTypes,
                (il, collection) =>
            {
                il.EmitAnyLdarg(2);
                il.EmitAnyStloc(collection);
            }
                );
            CreateTupleUnpack(
                emitter,
                itemTypes
                );

            return(emitter);
        }
Example #4
0
        /// <summary>
        ///		Creates new <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
        /// </summary>
        /// <param name="targetType">The type of the serialization target.</param>
        /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
        /// <returns>New <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
        public EnumSerializerEmitter CreateEnumEmitter(Type targetType, EmitterFlavor emitterFlavor)
        {
            Contract.Requires(targetType != null);
            Contract.Ensures(Contract.Result <EnumSerializerEmitter>() != null);

            return(this.CreateEnumEmitterCore(targetType, emitterFlavor));
        }
Example #5
0
        private static void TestFieldInvalidTypeCore(SerializationMethod method, EmitterFlavor flavor)
        {
            var serializer = CreateSerializer <VersioningTestTarget>(flavor);

            using (var stream = new MemoryStream())
            {
                if (method == SerializationMethod.Array)
                {
                    stream.Write(new byte[] { 0x93, 0x1, 0xFF, 0x1 });
                }
                else
                {
                    var packer = Packer.Create(stream, false);
                    packer.PackMapHeader(3);
                    packer.PackString("Field1");
                    packer.Pack(1);
                    packer.PackString("Field2");
                    packer.Pack(-1);
                    packer.PackString("Field3");
                    packer.Pack(1);
                }

                stream.Position = 0;

                var result = serializer.Unpack(stream);

                Assert.That(result.Field1, Is.EqualTo(1));
                Assert.That(result.Field2, Is.EqualTo(-1));
                Assert.That(result.Field3, Is.EqualTo("a"));
            }
        }
Example #6
0
        private static void TestExtraFieldCore <T>(SerializationMethod method, EmitterFlavor flavor)
        {
            var serializer = CreateSerializer <T>(flavor);

            using (var stream = new MemoryStream())
            {
                if (method == SerializationMethod.Array)
                {
                    stream.Write(new byte[] { 0x94, 0x1, 0xFF, 0xA1, ( byte )'a', 0xC0 });
                }
                else
                {
                    var packer = Packer.Create(stream, false);
                    packer.PackMapHeader(5);
                    packer.Pack("Field1");
                    packer.Pack(1);
                    packer.Pack("Extra");
                    packer.PackNull();
                    packer.Pack("Field2");
                    packer.Pack(-1);
                    packer.Pack("Field3");
                    packer.Pack("a");
                    packer.Pack("Extra");
                    packer.PackNull();
                }

                stream.Position = 0;

                serializer.Unpack(stream);
            }
        }
        private static void TestExtraFieldCore <T>(SerializationMethod method, EmitterFlavor flavor)
        {
            var context = new SerializationContext()
            {
                SerializationMethod = method, EmitterFlavor = flavor
            };

            var serializer = MessagePackSerializer.Create <T>(context);

            using (var stream = new MemoryStream())
            {
                if (method == SerializationMethod.Array)
                {
                    stream.Write(new byte[] { 0x94, 0x1, 0xFF, 0xA1, ( byte )'a', 0xC0 });
                }
                else
                {
                    var packer = Packer.Create(stream, false);
                    packer.PackMapHeader(4);
                    packer.Pack("Field1");
                    packer.Pack(1);
                    packer.Pack("Field2");
                    packer.Pack(-1);
                    packer.Pack("Field3");
                    packer.Pack("a");
                    packer.Pack("Extra");
                    packer.PackNull();
                }

                stream.Position = 0;

                var result = serializer.Unpack(stream);

                /*
                 * if ( result is IMessagePackExtensibleObject )
                 * {
                 *      var extensionData = ( ( IMessagePackExtensibleObject )result ).ExtensionData;
                 *      Assert.That( extensionData.IsNil, Is.False );
                 *
                 *      if ( method == SerializationMethod.Array )
                 *      {
                 *              Assert.That( extensionData.AsList().Count, Is.EqualTo( 4 ) );
                 *              Assert.That( extensionData.AsList()[ 0 ] == 1 );
                 *              Assert.That( extensionData.AsList()[ 1 ] == -1 );
                 *              Assert.That( extensionData.AsList()[ 2 ] == "a" );
                 *              Assert.That( extensionData.AsList()[ 3 ].IsNil );
                 *      }
                 *      else
                 *      {
                 *              Assert.That( extensionData.AsDictionary().Count, Is.EqualTo( 4 ) );
                 *              Assert.That( extensionData.AsDictionary()[ "Field1" ] == 1 );
                 *              Assert.That( extensionData.AsDictionary()[ "Field2" ] == -1 );
                 *              Assert.That( extensionData.AsDictionary()[ "Field3" ] == "a" );
                 *              Assert.That( extensionData.AsDictionary()[ "Extra" ].IsNil );
                 *      }
                 * }
                 */
            }
        }
		/// <summary>
		///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="targetType">The type of the serialization target.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		public SerializerEmitter CreateEmitter( Type targetType, EmitterFlavor emitterFlavor )
		{
			Contract.Requires( targetType != null );
			Contract.Requires( emitterFlavor == EmitterFlavor.FieldBased || emitterFlavor == EmitterFlavor.ContextBased );
			Contract.Ensures( Contract.Result<SerializerEmitter>() != null );

			return this.CreateEmitterCore( targetType , emitterFlavor);
		}
        /// <summary>
        ///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
        /// </summary>
        /// <param name="targetType">The type of the serialization target.</param>
        /// <param name="baseClass">Type of the base class of the serializer.</param>
        /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
        /// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
        public SerializerEmitter CreateEmitter(Type targetType, Type baseClass, EmitterFlavor emitterFlavor)
        {
            Contract.Requires(targetType != null);
            Contract.Requires(baseClass != null);
            Contract.Ensures(Contract.Result <SerializerEmitter>() != null);

            return(this.CreateEmitterCore(targetType, baseClass, emitterFlavor));
        }
Example #10
0
        /// <summary>
        ///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
        /// </summary>
        /// <param name="targetType">The type of the serialization target.</param>
        /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
        /// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
        public SerializerEmitter CreateEmitter(Type targetType, EmitterFlavor emitterFlavor)
        {
            Contract.Requires(targetType != null);
            Contract.Requires(emitterFlavor == EmitterFlavor.FieldBased || emitterFlavor == EmitterFlavor.ContextBased);
            Contract.Ensures(Contract.Result <SerializerEmitter>() != null);

            return(this.CreateEmitterCore(targetType, emitterFlavor));
        }
        public static SerializerEmitter CreateArraySerializerCore(Type targetType, EmitterFlavor emitterFlavor)
        {
            Contract.Requires(targetType != null);
            SerializerEmitter emitter          = SerializationMethodGeneratorManager.Get().CreateEmitter(targetType, emitterFlavor);
            CollectionTraits  collectionTraits = targetType.GetCollectionTraits();

            CreatePackArrayProceduresCore(targetType, emitter, collectionTraits);
            CreateUnpackArrayProceduresCore(targetType, emitter, collectionTraits);
            return(emitter);
        }
		public static SerializerEmitter CreateArraySerializerCore( Type targetType, EmitterFlavor emitterFlavor )
		{
			Contract.Requires( targetType != null );
			Contract.Ensures( Contract.Result<SerializerEmitter>() != null );

			var emitter = SerializationMethodGeneratorManager.Get().CreateEmitter( targetType, emitterFlavor );
			var traits = targetType.GetCollectionTraits();
			CreatePackArrayProceduresCore( targetType, emitter, traits );
			CreateUnpackArrayProceduresCore( targetType, emitter, traits );
			return emitter;
		}
Example #13
0
        private static void TestCore(EmitterFlavor emittingFlavor, SerializationMethod serializationMethod, Func <SerializationContext, SerializerBuilder <DirectoryItem> > builderProvider)
        {
            var root = new DirectoryItem()
            {
                Name = "/"
            };

            root.Directories =
                new[]
            {
                new DirectoryItem()
                {
                    Name = "tmp/"
                },
                new DirectoryItem()
                {
                    Name        = "var/",
                    Directories = new DirectoryItem[0],
                    Files       = new [] { new FileItem()
                                           {
                                               Name = "system.log"
                                           } }
                }
            };
            root.Files = new FileItem[0];

            var serializer = new AutoMessagePackSerializer <DirectoryItem>(new SerializationContext()
            {
                EmitterFlavor = emittingFlavor, SerializationMethod = serializationMethod, GeneratorOption = SerializationMethodGeneratorOption.CanDump
            }, builderProvider);

            using (var memoryStream = new MemoryStream())
            {
                serializer.Pack(memoryStream, root);

                memoryStream.Position = 0;
                var result = serializer.Unpack(memoryStream);
                Assert.That(result.Name, Is.EqualTo("/"));
                Assert.That(result.Files, Is.Not.Null.And.Empty);
                Assert.That(result.Directories, Is.Not.Null.And.Length.EqualTo(2));
                Assert.That(result.Directories[0], Is.Not.Null);
                Assert.That(result.Directories[0].Name, Is.EqualTo("tmp/"));
                Assert.That(result.Directories[0].Files, Is.Null);
                Assert.That(result.Directories[0].Directories, Is.Null);
                Assert.That(result.Directories[1], Is.Not.Null);
                Assert.That(result.Directories[1].Name, Is.EqualTo("var/"));
                Assert.That(result.Directories[1].Files, Is.Not.Null.And.Length.EqualTo(1));
                Assert.That(result.Directories[1].Files[0], Is.Not.Null);
                Assert.That(result.Directories[1].Files[0].Name, Is.EqualTo("system.log"));
                Assert.That(result.Directories[1].Directories, Is.Not.Null.And.Empty);
            }
        }
Example #14
0
        private static MessagePackSerializer <T> CreateSerializer <T>(EmitterFlavor flavor)
        {
#if NETFX_35 || NETFX_CORE || SILVERLIGHT
            var context = new SerializationContext();
#else
            var context = PreGeneratedSerializerActivator.CreateContext(SerializationMethod.Array, SerializationContext.Default.CompatibilityOptions.PackerCompatibilityOptions);
#endif
#if !XAMIOS && !UNITY_IPHONE
            context.SerializerOptions.EmitterFlavor = flavor;
            return(MessagePackSerializer.CreateInternal <T>(context, PolymorphismSchema.Default));
#else
            return(context.GetSerializer <T>());
#endif // !XAMIOS && !UNITY_IPHONE
        }
Example #15
0
        private static MessagePackSerializer <T> CreateSerializer <T>(EmitterFlavor flavor)
        {
            var context =
#if AOT
                flavor != EmitterFlavor.ReflectionBased
                                ? PreGeneratedSerializerActivator.CreateContext(SerializationMethod.Array, SerializationContext.Default.CompatibilityOptions.PackerCompatibilityOptions) :
#endif // AOT
                new SerializationContext();

#if !AOT
            context.SerializerOptions.EmitterFlavor = flavor;
            return(MessagePackSerializer.CreateInternal <T>(context, PolymorphismSchema.Default));
#else
            return(context.GetSerializer <T>());
#endif // !AOT
        }
Example #16
0
        internal NullableMessagePackSerializer(SerializationContext context, EmitterFlavor emitterFlavor)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (NullableMessagePackSerializer <T> ._nullableTImplicitOperator == null)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "'{0}' is not nullable type.", new object[] { typeof(T) }));
            }
            SerializerEmitter emitter = SerializationMethodGeneratorManager.Get().CreateEmitter(typeof(T), emitterFlavor);

            NullableMessagePackSerializer <T> .CreatePacking(emitter);

            NullableMessagePackSerializer <T> .CreateUnpacking(emitter);

            this._underlying = emitter.CreateInstance <T>(context);
        }
        /// <summary>
        ///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
        /// </summary>
        /// <param name="targetType">The type of the serialization target.</param>
        /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
        /// <returns>
        ///		New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
        /// </returns>
        protected override SerializerEmitter CreateEmitterCore(Type targetType, EmitterFlavor emitterFlavor)
        {
#if !WINDOWS_PHONE
            switch (emitterFlavor)
            {
            case EmitterFlavor.FieldBased:
            {
                return(new FieldBasedSerializerEmitter(this._module, this._isExternalAssemblyBuilder ? default(int?) : Interlocked.Increment(ref this._typeSequence), targetType, this._isDebuggable));
            }

            default:
            {
                return(new ContextBasedSerializerEmitter(targetType));
            }
            }
#else
            return(new ContextBasedSerializerEmitter(targetType));
#endif
        }
Example #18
0
        private static void TestExtraFieldCore(SerializationMethod method, EmitterFlavor flavor, PackerCompatibilityOptions compat)
        {
            var serializer = CreateSerializer <VersioningTestTarget>(flavor);

            using (var stream = new MemoryStream())
            {
                if (method == SerializationMethod.Array)
                {
                    stream.Write(new byte[] { 0x94, 0x1, 0xFF, 0xA1, ( byte )'a', 0xA1, 0xC0 });
                }
                else
                {
                    const string String10 = "1234567890";                               // packed as MinimumFixedRaw or Bin8
                    const string String40 = "1234567890123456789012345678901234567890"; // packed as Bin8 or Str8
                    var          packer   = Packer.Create(stream, compat, false);
                    packer.PackMapHeader(7);
                    packer.PackString("Field1");
                    packer.Pack(1);
                    packer.PackString("Extra1");
                    packer.PackString(String40);
                    packer.PackString("Extra2");
                    packer.PackBinary(System.Text.Encoding.UTF8.GetBytes(String40));
                    packer.PackString("Field2");
                    packer.Pack(-1);
                    packer.PackString("Extra3");
                    packer.PackString(String10);
                    packer.PackString("Field3");
                    packer.PackString("a");
                    packer.PackString("Extra4");
                    packer.PackArrayHeader(1);
                    packer.PackNull();
                }

                stream.Position = 0;

                var result = serializer.Unpack(stream);

                Assert.That(result.Field1, Is.EqualTo(1));
                Assert.That(result.Field2, Is.EqualTo(-1));
                Assert.That(result.Field3, Is.EqualTo("a"));
            }
        }
Example #19
0
        public static SerializerEmitter CreateMapSerializerCore(Type targetType, EmitterFlavor emitterFlavor)
        {
            Contract.Requires(targetType != null);
            Contract.Ensures(Contract.Result <SerializerEmitter>() != null);


            var emitter = SerializationMethodGeneratorManager.Get().CreateEmitter(targetType, emitterFlavor);
            var traits  = targetType.GetCollectionTraits();

            CreateMapPack(
                targetType,
                emitter,
                traits
                );
            CreateMapUnpack(
                targetType,
                emitter,
                traits
                );

            return(emitter);
        }
Example #20
0
        private static void TestCore(EmitterFlavor emittingFlavor, SerializationMethod serializationMethod, ISerializerBuilder <DirectoryItem> generator)
        {
            var root = new DirectoryItem()
            {
                Name = "/"
            };

            root.Directories =
                new[]
            {
                new DirectoryItem()
                {
                    Name = "tmp/"
                },
                new DirectoryItem()
                {
                    Name        = "var/",
                    Directories = new DirectoryItem[0],
                    Files       = new [] { new FileItem()
                                           {
                                               Name = "system.log"
                                           } }
                }
            };
            root.Files = new FileItem[0];

            var serializer =
                new AutoMessagePackSerializer <DirectoryItem>(
                    new SerializationContext
            {
                EmitterFlavor       = emittingFlavor,
                SerializationMethod = serializationMethod,
#if SILVERLIGHT
                GeneratorOption = SerializationMethodGeneratorOption.Fast
#else
                GeneratorOption = SerializationMethodGeneratorOption.CanDump
#endif
            },
Example #21
0
		private static void TestCore( EmitterFlavor emittingFlavor, Func<SerializationContext, SerializerBuilder<DirectoryItem>> builderProvider )
		{
			var root = new DirectoryItem() { Name = "/" };
			root.Directories =
				new[]
				{
					new DirectoryItem() { Name = "tmp/" },
					new DirectoryItem() 
					{ 
						Name = "var/", 
						Directories = new DirectoryItem[ 0 ], 
						Files = new []{ new FileItem(){ Name = "system.log" } }
					}
				};
			root.Files = new FileItem[ 0 ];

			var serializer = new AutoMessagePackSerializer<DirectoryItem>( new SerializationContext() { EmitterFlavor = emittingFlavor, GeneratorOption = SerializationMethodGeneratorOption.CanDump }, builderProvider );
			using ( var memoryStream = new MemoryStream() )
			{
				serializer.Pack( memoryStream, root );

				memoryStream.Position = 0;
				var result = serializer.Unpack( memoryStream );
				Assert.That( result.Name, Is.EqualTo( "/" ) );
				Assert.That( result.Files, Is.Not.Null.And.Empty );
				Assert.That( result.Directories, Is.Not.Null.And.Length.EqualTo( 2 ) );
				Assert.That( result.Directories[ 0 ], Is.Not.Null );
				Assert.That( result.Directories[ 0 ].Name, Is.EqualTo( "tmp/" ) );
				Assert.That( result.Directories[ 0 ].Files, Is.Null );
				Assert.That( result.Directories[ 0 ].Directories, Is.Null );
				Assert.That( result.Directories[ 1 ], Is.Not.Null );
				Assert.That( result.Directories[ 1 ].Name, Is.EqualTo( "var/" ) );
				Assert.That( result.Directories[ 1 ].Files, Is.Not.Null.And.Length.EqualTo( 1 ) );
				Assert.That( result.Directories[ 1 ].Files[ 0 ], Is.Not.Null );
				Assert.That( result.Directories[ 1 ].Files[ 0 ].Name, Is.EqualTo( "system.log" ) );
				Assert.That( result.Directories[ 1 ].Directories, Is.Not.Null.And.Empty );
			}
		}
Example #22
0
        private static void TestFieldSwappedCore(EmitterFlavor flavor)
        {
            var serializer = CreateSerializer <VersioningTestTarget>(flavor);

            using (var stream = new MemoryStream())
            {
                var packer = Packer.Create(stream, false);
                packer.PackMapHeader(3);
                packer.PackString("Field1");
                packer.Pack(1);
                packer.PackString("Field2");
                packer.Pack(-1);
                packer.PackString("Extra");
                packer.Pack(2);                   // Issue6

                stream.Position = 0;

                var result = serializer.Unpack(stream);

                Assert.That(result.Field1, Is.EqualTo(1));
                Assert.That(result.Field2, Is.EqualTo(-1));
                Assert.That(result.Field3, Is.Null);
            }
        }
        private static void TestExtraFieldRoundTripCore <T>(SerializationMethod method, EmitterFlavor flavor)
        {
            var context = new SerializationContext()
            {
                SerializationMethod = method, EmitterFlavor = flavor
            };

            var serializer = MessagePackSerializer.Create <T>(context);

            using (var stream = new MemoryStream())
            {
                if (method == SerializationMethod.Array)
                {
                    stream.Write(new byte[] { 0x94, 0x1, 0xFF, 0xA1, ( byte )'a', 0xC0 });
                }
                else
                {
                    var packer = Packer.Create(stream, false);
                    packer.PackMapHeader(4);
                    packer.Pack("Field1");
                    packer.Pack(1);
                    packer.Pack("Field2");
                    packer.Pack(-1);
                    packer.Pack("Field3");
                    packer.Pack("a");
                    packer.Pack("Extra");
                    packer.PackNull();
                }

                byte[] bytes = stream.ToArray();

                stream.Position = 0;

                var result = serializer.Unpack(stream);

                stream.SetLength(0);
                serializer.Pack(stream, result);

                Assert.That(stream.ToArray(), Is.EqualTo(bytes));
            }
        }
 /// <summary>
 ///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
 /// </summary>
 /// <param name="specification">The specification of the serializer.</param>
 /// <param name="baseClass">Type of the base class of the serializer.</param>
 /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
 /// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
 protected abstract SerializerEmitter CreateEmitterCore(SerializerSpecification specification, Type baseClass, EmitterFlavor emitterFlavor);
		/// <summary>
		///		Creates new <see cref="EnumSerializerEmitter" /> which corresponds to the specified <see cref="EmitterFlavor" />.
		/// </summary>
		/// <param name="context">The <see cref="SerializationContext" />.</param>
		/// <param name="specification">The specification of the serializer.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor" />.</param>
		/// <returns>
		///		New <see cref="SerializerEmitter" /> which corresponds to the specified <see cref="EmitterFlavor" />.
		/// </returns>
		protected override EnumSerializerEmitter CreateEnumEmitterCore( SerializationContext context, SerializerSpecification specification, EmitterFlavor emitterFlavor )
		{
#if !WINDOWS_PHONE
			switch ( emitterFlavor )
			{
				case EmitterFlavor.FieldBased:
				{
					return new FieldBasedEnumSerializerEmitter( context, this._module, specification, this._isDebuggable );
				}
				default:
				{
					return new ContextBasedEnumSerializerEmitter( specification );
				}
			}
#else
			return new ContextBasedEnumSerializerEmitter( targetType );
#endif
		}
Example #26
0
 /// <summary>
 ///		Creates new <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
 /// </summary>
 /// <param name="targetType">The type of the serialization target.</param>
 /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
 /// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
 protected abstract EnumSerializerEmitter CreateEnumEmitterCore(Type targetType, EmitterFlavor emitterFlavor);
		/// <summary>
		///		Creates new <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="context">The <see cref="SerializationContext"/>.</param>
		/// <param name="specification">The specification of the serializer.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		public EnumSerializerEmitter CreateEnumEmitter( SerializationContext context, SerializerSpecification specification, EmitterFlavor emitterFlavor )
		{
			Contract.Requires( context != null );
			Contract.Requires( specification != null );
			Contract.Ensures( Contract.Result<EnumSerializerEmitter>() != null );

			return this.CreateEnumEmitterCore( context, specification, emitterFlavor );
		}
Example #28
0
		private static TestResult[] Test(
			EmitterFlavor flavor,
			SerializationMethod method,
			EnumSerializationMethod enumMethod )
		{
			var stopWatch = new Stopwatch();
			using ( var buffer = new MemoryStream() )
			{
				// JIT
				TestCreateSerializer(
					stopWatch,
					new SerializationContext
					{
						EmitterFlavor = flavor,
						SerializationMethod = method,
						EnumSerializationMethod = enumMethod
					}
					);
				TestSerialize(
					stopWatch,
					buffer,
					new SerializationContext
					{
						EmitterFlavor = flavor,
						SerializationMethod = method,
						EnumSerializationMethod = enumMethod
					}
					);
				buffer.Position = 0;
				TestDeserialize(
					stopWatch,
					buffer,
					new SerializationContext
					{
						EmitterFlavor = flavor,
						SerializationMethod = method,
						EnumSerializationMethod = enumMethod
					}
					);

				var samples = new long[ flavor == EmitterFlavor.CodeDomBased ? 10 : Iteration ];

				// 1st-time only
				for ( int i = 0; i < samples.Length; i++ )
				{
					TestCreateSerializer(
						stopWatch,
						new SerializationContext
						{
							EmitterFlavor = flavor,
							SerializationMethod = method,
							EnumSerializationMethod = enumMethod
						}
						);
					samples[ i ] = stopWatch.Elapsed.Ticks;
				}

				var creationResult = Calculate( samples );

				samples = new long[ Iteration ];

				// Exept-1st time
				var context =
					new SerializationContext
					{
						EmitterFlavor = flavor,
						SerializationMethod = method,
						EnumSerializationMethod = enumMethod
					};

				var samples2 = new long[ samples.Length ];

				// Dry-run
				buffer.SetLength( 0 );
				TestSerialize( stopWatch, buffer, context );
				buffer.Position = 0;
				TestDeserialize( stopWatch, buffer, context );

				for ( int i = 0; i < samples.Length; i++ )
				{
					buffer.SetLength( 0 );
					TestSerialize( stopWatch, buffer, context );
					samples[ i ] = stopWatch.Elapsed.Ticks;
					buffer.Position = 0;
					TestDeserialize( stopWatch, buffer, context );
					samples2[ i ] = stopWatch.Elapsed.Ticks;
				}

				var serializationResult = Calculate( samples );
				var deserializationResult = Calculate( samples2 );

				return new TestResult[] { creationResult, serializationResult, deserializationResult };
			}
		}
		/// <summary>
		///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="targetType">The type of the serialization target.</param>
		/// <param name="baseClass">Type of the base class of the serializer.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		public SerializerEmitter CreateEmitter( Type targetType, Type baseClass, EmitterFlavor emitterFlavor )
		{
			Contract.Requires( targetType != null );
			Contract.Requires( baseClass != null );
			Contract.Ensures( Contract.Result<SerializerEmitter>() != null );

			return this.CreateEmitterCore( targetType, baseClass, emitterFlavor );
		}
		/// <summary>
		///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="targetType">The type of the serialization target.</param>
		/// <param name="baseClass">Type of the base class of the serializer.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		protected abstract SerializerEmitter CreateEmitterCore( Type targetType, Type baseClass, EmitterFlavor emitterFlavor );
		public static SerializerEmitter CreateTupleSerializerCore( Type tupleType, EmitterFlavor emitterFlavor )
		{
			Contract.Requires( tupleType != null );
			Contract.Ensures( Contract.Result<SerializerEmitter>() != null );

			var emitter = SerializationMethodGeneratorManager.Get().CreateEmitter( tupleType, emitterFlavor );
			var itemTypes = TupleItems.GetTupleItemTypes( tupleType );
			CreateTuplePack(
				emitter,
				tupleType,
				itemTypes,
				( il, collection ) =>
				{
					il.EmitAnyLdarg( 2 );
					il.EmitAnyStloc( collection );
				}
			);
			CreateTupleUnpack(
				emitter,
				itemTypes
			);

			return emitter;
		}
Example #32
0
 /// <summary>
 ///		Initializes a new instance of the <see cref="EmittingSerializerBuilder&lt;TObject&gt;"/> class.
 /// </summary>
 /// <param name="context">The <see cref="SerializationContext"/>.</param>
 protected EmittingSerializerBuilder(SerializationContext context)
     : base(context)
 {
     this._emitterFlavor    = context.EmitterFlavor;
     this._generatorManager = SerializationMethodGeneratorManager.Get(context.GeneratorOption);
 }
Example #33
0
        public static SerializerEmitter CreateArraySerializerCore(SerializationContext context, Type targetType, EmitterFlavor emitterFlavor)
        {
            Contract.Requires(targetType != null);
            Contract.Ensures(Contract.Result <SerializerEmitter>() != null);

            var emitter = SerializationMethodGeneratorManager.Get().CreateEmitter(targetType, emitterFlavor);
            var traits  = targetType.GetCollectionTraits();

            CreatePackArrayProceduresCore(targetType, emitter, traits);
            CreateUnpackArrayProceduresCore(context, targetType, emitter, traits);
            return(emitter);
        }
 /// <summary>
 ///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
 /// </summary>
 /// <param name="targetType">The type of the serialization target.</param>
 /// <param name="baseClass">Type of the base class of the serializer.</param>
 /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
 /// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
 protected abstract SerializerEmitter CreateEmitterCore(Type targetType, Type baseClass, EmitterFlavor emitterFlavor);
        /// <summary>
        ///		Creates new <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
        /// </summary>
        /// <param name="context">The <see cref="SerializationContext"/>.</param>
        /// <param name="specification">The specification of the serializer.</param>
        /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
        /// <returns>New <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
        public EnumSerializerEmitter CreateEnumEmitter(SerializationContext context, SerializerSpecification specification, EmitterFlavor emitterFlavor)
        {
            Contract.Requires(context != null);
            Contract.Requires(specification != null);
            Contract.Ensures(Contract.Result <EnumSerializerEmitter>() != null);

            return(this.CreateEnumEmitterCore(context, specification, emitterFlavor));
        }
Example #36
0
		private static void TestCore( EmitterFlavor emittingFlavor, SerializationMethod serializationMethod, ISerializerBuilder generator )
		{
			var root = new DirectoryItem() { Name = "/" };
			root.Directories =
				new[]
				{
					new DirectoryItem() { Name = "tmp/" },
					new DirectoryItem() 
					{ 
						Name = "var/", 
						Directories = new DirectoryItem[ 0 ], 
						Files = new []{ new FileItem(){ Name = "system.log" } }
					}
				};
			root.Files = new FileItem[ 0 ];

			var context =
				new SerializationContext
				{
					SerializationMethod = serializationMethod,
					SerializerOptions =
					{
						GeneratorOption = SerializationMethodGeneratorOption.CanDump,
						EmitterFlavor = emittingFlavor
					}
				};

			var serializer =
				( MessagePackSerializer<DirectoryItem> ) generator.BuildSerializerInstance(
					context,
					typeof( DirectoryItem ),
					PolymorphismSchema.Default
				);
			using ( var memoryStream = new MemoryStream() )
			{
				serializer.Pack( memoryStream, root );

				memoryStream.Position = 0;
				var result = serializer.Unpack( memoryStream );
				Assert.That( result.Name, Is.EqualTo( "/" ) );
				Assert.That( result.Files, Is.Not.Null.And.Empty );
				Assert.That( result.Directories, Is.Not.Null.And.Length.EqualTo( 2 ) );
				Assert.That( result.Directories[ 0 ], Is.Not.Null );
				Assert.That( result.Directories[ 0 ].Name, Is.EqualTo( "tmp/" ) );
				Assert.That( result.Directories[ 0 ].Files, Is.Null );
				Assert.That( result.Directories[ 0 ].Directories, Is.Null );
				Assert.That( result.Directories[ 1 ], Is.Not.Null );
				Assert.That( result.Directories[ 1 ].Name, Is.EqualTo( "var/" ) );
				Assert.That( result.Directories[ 1 ].Files, Is.Not.Null.And.Length.EqualTo( 1 ) );
				Assert.That( result.Directories[ 1 ].Files[ 0 ], Is.Not.Null );
				Assert.That( result.Directories[ 1 ].Files[ 0 ].Name, Is.EqualTo( "system.log" ) );
				Assert.That( result.Directories[ 1 ].Directories, Is.Not.Null.And.Empty );
			}
		}
		/// <summary>
		///		Creates new <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="targetType">The type of the serialization target.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		public EnumSerializerEmitter CreateEnumEmitter( Type targetType, EmitterFlavor emitterFlavor )
		{
			Contract.Requires( targetType != null );
			Contract.Ensures( Contract.Result<EnumSerializerEmitter>() != null );

			return this.CreateEnumEmitterCore( targetType, emitterFlavor );
		}
		/// <summary>
		///		Creates new <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="context">The <see cref="SerializationContext"/>.</param>
		/// <param name="specification">The specification of the serializer.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		protected abstract EnumSerializerEmitter CreateEnumEmitterCore( SerializationContext context, SerializerSpecification specification, EmitterFlavor emitterFlavor );
		/// <summary>
		///		Creates new <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="targetType">The type of the serialization target.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		protected abstract EnumSerializerEmitter CreateEnumEmitterCore( Type targetType, EmitterFlavor emitterFlavor );
		protected override EnumSerializerEmitter CreateEnumEmitterCore( Type targetType, EmitterFlavor emitterFlavor )
		{
#if !WINDOWS_PHONE
			switch ( emitterFlavor )
			{
				case EmitterFlavor.FieldBased:
				{
					return new FieldBasedEnumSerializerEmitter( this._module, this._isExternalAssemblyBuilder ? default( int? ) : Interlocked.Increment( ref this._typeSequence ), targetType, this._isDebuggable );
				}
				default:
				{
					return new ContextBasedEnumSerializerEmitter( targetType );
				}
			}
#else
			return new ContextBasedEnumSerializerEmitter( targetType );
#endif
		}
 protected sealed override SerializerEmitter CreateEmitterCore(Type targetType, EmitterFlavor emitterFlavor)
 {
     switch (emitterFlavor)
     {
     case EmitterFlavor.FieldBased:
         return(new FieldBasedSerializerEmitter(this._module, this._isExternalAssemblyBuilder ? null : new int?(Interlocked.Increment(ref this._typeSequence)), targetType, this._isDebuggable));
     }
     return(new ContextBasedSerializerEmitter(targetType));
 }
Example #42
0
        private static void TestCore(EmitterFlavor emittingFlavor, SerializationMethod serializationMethod, ISerializerBuilder generator)
        {
            var root = new DirectoryItem()
            {
                Name = "/"
            };

            root.Directories =
                new[]
            {
                new DirectoryItem()
                {
                    Name = "tmp/"
                },
                new DirectoryItem()
                {
                    Name        = "var/",
                    Directories = new DirectoryItem[0],
                    Files       = new [] { new FileItem()
                                           {
                                               Name = "system.log"
                                           } }
                }
            };
            root.Files = new FileItem[0];

            var context =
                new SerializationContext
            {
                SerializationMethod = serializationMethod,
                SerializerOptions   =
                {
#if !NETSTANDARD1_3
                    GeneratorOption = SerializationMethodGeneratorOption.CanDump,
#endif // !NETSTANDARD1_3
                    EmitterFlavor   = emittingFlavor
                }
            };

            var serializer =
                (MessagePackSerializer <DirectoryItem>)generator.BuildSerializerInstance(
                    context,
                    typeof(DirectoryItem),
                    PolymorphismSchema.Default
                    );

            using (var memoryStream = new MemoryStream())
            {
                serializer.Pack(memoryStream, root);

                memoryStream.Position = 0;
                var result = serializer.Unpack(memoryStream);
                Assert.That(result.Name, Is.EqualTo("/"));
                Assert.That(result.Files, Is.Not.Null.And.Empty);
                Assert.That(result.Directories, Is.Not.Null.And.Length.EqualTo(2));
                Assert.That(result.Directories[0], Is.Not.Null);
                Assert.That(result.Directories[0].Name, Is.EqualTo("tmp/"));
                Assert.That(result.Directories[0].Files, Is.Null);
                Assert.That(result.Directories[0].Directories, Is.Null);
                Assert.That(result.Directories[1], Is.Not.Null);
                Assert.That(result.Directories[1].Name, Is.EqualTo("var/"));
                Assert.That(result.Directories[1].Files, Is.Not.Null.And.Length.EqualTo(1));
                Assert.That(result.Directories[1].Files[0], Is.Not.Null);
                Assert.That(result.Directories[1].Files[0].Name, Is.EqualTo("system.log"));
                Assert.That(result.Directories[1].Directories, Is.Not.Null.And.Empty);
            }
        }
		/// <summary>
		///		Creates new <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="context">The <see cref="SerializationContext"/>.</param>
		/// <param name="targetType">The type of the serialization target.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		protected abstract EnumSerializerEmitter CreateEnumEmitterCore( SerializationContext context, Type targetType, EmitterFlavor emitterFlavor );
		/// <summary>
		///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="specification">The specification of the serializer.</param>
		/// <param name="baseClass">Type of the base class of the serializer.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		protected abstract SerializerEmitter CreateEmitterCore( SerializerSpecification specification, Type baseClass, EmitterFlavor emitterFlavor );
		public static SerializerEmitter CreateMapSerializerCore( SerializationContext context, Type targetType, EmitterFlavor emitterFlavor )
		{
			Contract.Requires( targetType != null );
			Contract.Ensures( Contract.Result<SerializerEmitter>() != null );


			var emitter = SerializationMethodGeneratorManager.Get().CreateEmitter( targetType, emitterFlavor );
			var traits = targetType.GetCollectionTraits();
			CreateMapPack(
				targetType,
				emitter,
				traits
			);
			CreateMapUnpack(
				context,
				targetType,
				emitter,
				traits
			);

			return emitter;
		}
		/// <summary>
		///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="specification">The specification of the serializer.</param>
		/// <param name="baseClass">Type of the base class of the serializer.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
		public SerializerEmitter CreateEmitter( SerializerSpecification specification, Type baseClass, EmitterFlavor emitterFlavor )
		{
			Contract.Requires( specification != null );
			Contract.Requires( baseClass != null );
			Contract.Ensures( Contract.Result<SerializerEmitter>() != null );

			return this.CreateEmitterCore( specification, baseClass, emitterFlavor );
		}
		/// <summary>
		///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </summary>
		/// <param name="targetType">The type of the serialization target.</param>
		/// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
		/// <returns>
		///		New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
		/// </returns>
		protected sealed override SerializerEmitter CreateEmitterCore( Type targetType, EmitterFlavor emitterFlavor )
		{
#if !WINDOWS_PHONE
			switch ( emitterFlavor )
			{
				case EmitterFlavor.FieldBased:
				{
					return new FieldBasedSerializerEmitter( this._module, Interlocked.Increment( ref this._typeSequence ), targetType, this._isDebuggable );
				}
				case EmitterFlavor.ContextBased:
				default:
				{
					return new ContextBasedSerializerEmitter( targetType );
				}
			}
#else
			return new ContextBasedSerializerEmitter( targetType );
#endif
		}
 /// <summary>
 ///		Creates new <see cref="EnumSerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
 /// </summary>
 /// <param name="context">The <see cref="SerializationContext"/>.</param>
 /// <param name="specification">The specification of the serializer.</param>
 /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
 /// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
 protected abstract EnumSerializerEmitter CreateEnumEmitterCore(SerializationContext context, SerializerSpecification specification, EmitterFlavor emitterFlavor);
        /// <summary>
        ///		Creates new <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.
        /// </summary>
        /// <param name="specification">The specification of the serializer.</param>
        /// <param name="baseClass">Type of the base class of the serializer.</param>
        /// <param name="emitterFlavor"><see cref="EmitterFlavor"/>.</param>
        /// <returns>New <see cref="SerializerEmitter"/> which corresponds to the specified <see cref="EmitterFlavor"/>.</returns>
        public SerializerEmitter CreateEmitter(SerializerSpecification specification, Type baseClass, EmitterFlavor emitterFlavor)
        {
            Contract.Requires(specification != null);
            Contract.Requires(baseClass != null);
            Contract.Ensures(Contract.Result <SerializerEmitter>() != null);

            return(this.CreateEmitterCore(specification, baseClass, emitterFlavor));
        }