public static void Deserializing_constructors___When_properties_exist___Works()
        {
            // Arrange
            var serializationConfigurationType1 = typeof(IncludeVersionlessAssemblyQualifiedNamePropertyBagSerializationConfiguration <TypesToRegisterPropertyBagSerializationConfiguration <ConstructorWithProperties> >);
            var serializationConfigurationType2 = typeof(ExcludeVersionlessAssemblyQualifiedNamePropertyBagSerializationConfiguration <TypesToRegisterPropertyBagSerializationConfiguration <ConstructorWithProperties> >);

            var serializer1 = new ObcPropertyBagSerializer(serializationConfigurationType1.ToPropertyBagSerializationConfigurationType());
            var serializer2 = new ObcPropertyBagSerializer(serializationConfigurationType2.ToPropertyBagSerializationConfigurationType());

            var expected = new ConstructorWithProperties(A.Dummy <string>(), A.Dummy <int>(), A.Dummy <DateTime>());

            var serializedPropertyBag1a = serializer1.SerializeToNamedPropertyBagWithStringValues(expected);
            var serializedPropertyBag1b = serializer1.SerializeToNamedPropertyBagWithObjectValues(expected);
            var serializedPropertyBag1c = serializer1.SerializeToOrdinalPropertyBagWithStringValues(expected);
            var serializedPropertyBag1d = serializer1.SerializeToOrdinalPropertyBagWithObjectValues(expected);

            var serializedPropertyBag2a = serializer2.SerializeToNamedPropertyBagWithStringValues(expected);
            var serializedPropertyBag2b = serializer2.SerializeToNamedPropertyBagWithObjectValues(expected);
            var serializedPropertyBag2c = serializer2.SerializeToOrdinalPropertyBagWithStringValues(expected);
            var serializedPropertyBag2d = serializer2.SerializeToOrdinalPropertyBagWithObjectValues(expected);

            // Act
            void ThrowIfObjectsDiffer(DescribedSerializationBase describedSerialization, ConstructorWithProperties deserialized)
            {
                deserialized.Property1.AsTest().Must().BeEqualTo(expected.Property1);
                deserialized.Property2.AsTest().Must().BeEqualTo(expected.Property2);
                deserialized.Property3.AsTest().Must().BeEqualTo(expected.Property3);
            }

            // Act, Assert
            expected.RoundtripSerializeViaPropertyBagWithCallbackVerification(ThrowIfObjectsDiffer);

            var actualPropertyBag1a = serializer1.Deserialize <ConstructorWithProperties>(serializedPropertyBag1a);
            var actualPropertyBag1b = serializer1.Deserialize <ConstructorWithProperties>(serializedPropertyBag1b);
            var actualPropertyBag1c = serializer1.Deserialize <ConstructorWithProperties>(serializedPropertyBag1c);
            var actualPropertyBag1d = serializer1.Deserialize <ConstructorWithProperties>(serializedPropertyBag1d);

            var actualPropertyBag2a = serializer1.Deserialize <ConstructorWithProperties>(serializedPropertyBag2a);
            var actualPropertyBag2b = serializer1.Deserialize <ConstructorWithProperties>(serializedPropertyBag2b);
            var actualPropertyBag2c = serializer1.Deserialize <ConstructorWithProperties>(serializedPropertyBag2c);
            var actualPropertyBag2d = serializer1.Deserialize <ConstructorWithProperties>(serializedPropertyBag2d);

            ThrowIfObjectsDiffer(null, actualPropertyBag1a);
            ThrowIfObjectsDiffer(null, actualPropertyBag1b);
            ThrowIfObjectsDiffer(null, actualPropertyBag1c);
            ThrowIfObjectsDiffer(null, actualPropertyBag1d);

            ThrowIfObjectsDiffer(null, actualPropertyBag2a);
            ThrowIfObjectsDiffer(null, actualPropertyBag2b);
            ThrowIfObjectsDiffer(null, actualPropertyBag2c);
            ThrowIfObjectsDiffer(null, actualPropertyBag2d);
        }
Ejemplo n.º 2
0
        /// <inheritdoc />
        public override ISerializer BuildSerializer(
            SerializerRepresentation serializerRepresentation,
            AssemblyMatchStrategy assemblyMatchStrategy = AssemblyMatchStrategy.AnySingleVersion)
        {
            if (serializerRepresentation == null)
            {
                throw new ArgumentNullException(nameof(serializerRepresentation));
            }

            ISerializer result;

            if (CachedSerializerRepresentationToSerializerMap.TryGetValue(serializerRepresentation, out ConcurrentDictionary <AssemblyMatchStrategy, ISerializer> assemblyMatchStrategyToSerializerMap))
            {
                if (assemblyMatchStrategyToSerializerMap.TryGetValue(assemblyMatchStrategy, out result))
                {
                    return(result);
                }
            }

            // ReSharper disable once RedundantArgumentDefaultValue
            var configurationType = serializerRepresentation.SerializationConfigType?.ResolveFromLoadedTypes(assemblyMatchStrategy, throwIfCannotResolve: true);

            ISerializer serializer;

            switch (serializerRepresentation.SerializationKind)
            {
            case SerializationKind.Bson:
                serializer = new ObcBsonSerializer(configurationType?.ToBsonSerializationConfigurationType());
                break;

            case SerializationKind.Json:
                serializer = new ObcJsonSerializer(configurationType?.ToJsonSerializationConfigurationType());
                break;

            case SerializationKind.PropertyBag:
                serializer = new ObcPropertyBagSerializer(configurationType?.ToPropertyBagSerializationConfigurationType());
                break;

            default:
                throw new NotSupportedException(Invariant($"{nameof(serializerRepresentation)} from enumeration {nameof(SerializationKind)} of {serializerRepresentation.SerializationKind} is not supported."));
            }

            result = this.WrapInCompressingSerializerIfAppropriate(serializer, serializerRepresentation.CompressionKind);

            CachedSerializerRepresentationToSerializerMap.TryAdd(serializerRepresentation, new ConcurrentDictionary <AssemblyMatchStrategy, ISerializer>());

            CachedSerializerRepresentationToSerializerMap[serializerRepresentation].TryAdd(assemblyMatchStrategy, result);

            return(result);
        }
        public static void RoundTrip___Supported_scenarios___Works()
        {
            // Arrange
            var serializationConfigurationType1 = typeof(PropertyBagConfigIncludingAssemblyQualifiedNameForInheritTypeBase);
            var serializationConfigurationType2 = typeof(PropertyBagConfigExcludingAssemblyQualifiedNameForInheritTypeBase);

            var serializer1 = new ObcPropertyBagSerializer(serializationConfigurationType1.ToPropertyBagSerializationConfigurationType());
            var serializer2 = new ObcPropertyBagSerializer(serializationConfigurationType2.ToPropertyBagSerializationConfigurationType());

            var expected = new ComplicatedObject
            {
                NullableDecimal         = 29m,
                BaseVersion             = new InheritTypeDerive(),
                DeriveVersion           = new InheritTypeDerive(),
                DeriveVersionArray      = new[] { new InheritTypeDerive(), },
                DeriveVersionCollection = new[] { new InheritTypeDerive(), }.ToList(),
                String = A.Dummy <string>(),
                Int = A.Dummy <int>(),
                TimeSpan = A.Dummy <TimeSpan>(),
                DateTime = A.Dummy <DateTime>(),
                DateTimeNullable = A.Dummy <DateTime>(),
                CustomWithoutInterface = new CustomWithoutInterface(),
                CustomWithInterface = new CustomWithInterface(),
                StringArray = new[] { A.Dummy <string>(), },
                StringCollection = new[] { A.Dummy <string>(), }.ToList(),
                IntCollection = new[] { A.Dummy <int>(), }.ToList(),
                TimeSpanCollection = new[] { A.Dummy <TimeSpan>(), }.ToList(),
                DateTimeCollection = new[] { A.Dummy <DateTime>(), }.ToList(),
                CustomWithoutInterfaceCollection = new[] { new CustomWithoutInterface(), new CustomWithoutInterface(), }.ToList(),
                CustomWithInterfaceCollection = new[] { new CustomWithInterface(), new CustomWithInterface(), }.ToList(),
                EnumParseCollection                   = new[] { EnumParse.Default, EnumParse.Value, },
                EnumParse                             = EnumParse.Value,
                StringCollectionWithSingleEmptyString = new[] { string.Empty },
                StringCollectionWithNulls             = new[] { string.Empty, A.Dummy <string>(), null, string.Empty, null, A.Dummy <string>() },
            };

            void ThrowIfObjectsDiffer(DescribedSerializationBase describedSerialization, ComplicatedObject deserialized)
            {
                deserialized.NullableDecimal.Should().Be(expected.NullableDecimal);
                deserialized.NullableDecimalDefault.Should().BeNull();
                deserialized.BaseVersion.Should().NotBeNull();
                deserialized.DeriveVersion.Should().NotBeNull();
                deserialized.DeriveVersionArray.Count().Should().Be(expected.DeriveVersionArray.Count());
                deserialized.DeriveVersionCollection.Count().Should().Be(expected.DeriveVersionCollection.Count());
                deserialized.String.Should().Be(expected.String);
                deserialized.Int.Should().Be(expected.Int);
                deserialized.TimeSpan.Should().Be(expected.TimeSpan);
                deserialized.DateTime.Should().Be(expected.DateTime);
                deserialized.DateTimeNullable.Should().Be(expected.DateTimeNullable);
                deserialized.CustomWithoutInterface.Should().NotBeNull();
                deserialized.CustomWithInterface.Should().NotBeNull();
                deserialized.StringDefault.Should().BeNull();
                deserialized.IntDefault.Should().Be(default(int));
                deserialized.TimeSpanDefault.Should().Be(default(TimeSpan));
                deserialized.DateTimeDefault.Should().Be(default(DateTime));
                deserialized.DateTimeNullableDefault.Should().BeNull();
                deserialized.CustomWithoutInterfaceDefault.Should().BeNull();
                deserialized.CustomWithInterfaceDefault.Should().BeNull();
                deserialized.StringArray.Should().Equal(expected.StringArray);
                deserialized.StringCollection.Should().Equal(expected.StringCollection);
                deserialized.IntCollection.Should().Equal(expected.IntCollection);
                deserialized.TimeSpanCollection.Should().Equal(expected.TimeSpanCollection);
                deserialized.DateTimeCollection.Should().Equal(expected.DateTimeCollection);
                deserialized.CustomWithoutInterfaceCollection.Should().HaveCount(expected.CustomWithoutInterfaceCollection.Count());
                deserialized.CustomWithInterfaceCollection.Should().HaveCount(expected.CustomWithInterfaceCollection.Count());
                deserialized.EnumParseCollection.Should().Equal(expected.EnumParseCollection);
                deserialized.EnumDefault.Should().Be(EnumParse.Default);
                deserialized.EnumParse.Should().Be(expected.EnumParse);
                deserialized.StringCollectionDefault.Should().BeNull();
                deserialized.StringCollectionWithSingleEmptyString.Should().Equal(expected.StringCollectionWithSingleEmptyString);
                deserialized.StringCollectionWithNulls.Should().Equal(expected.StringCollectionWithNulls);
            }

            var serializedPropertyBag1a = serializer1.SerializeToNamedPropertyBagWithStringValues(expected);
            var serializedPropertyBag1b = serializer1.SerializeToNamedPropertyBagWithObjectValues(expected);
            var serializedPropertyBag1c = serializer1.SerializeToOrdinalPropertyBagWithStringValues(expected);
            var serializedPropertyBag1d = serializer1.SerializeToOrdinalPropertyBagWithObjectValues(expected);

            var serializedPropertyBag2a = serializer2.SerializeToNamedPropertyBagWithStringValues(expected);
            var serializedPropertyBag2b = serializer2.SerializeToNamedPropertyBagWithObjectValues(expected);
            var serializedPropertyBag2c = serializer2.SerializeToOrdinalPropertyBagWithStringValues(expected);
            var serializedPropertyBag2d = serializer2.SerializeToOrdinalPropertyBagWithObjectValues(expected);

            // Act, Assert
            expected.RoundtripSerializeViaPropertyBagWithCallbackVerification(ThrowIfObjectsDiffer, serializationConfigurationType1);
            expected.RoundtripSerializeViaPropertyBagWithCallbackVerification(ThrowIfObjectsDiffer, serializationConfigurationType2);

            var actualPropertyBag1a = serializer1.Deserialize <ComplicatedObject>(serializedPropertyBag1a);
            var actualPropertyBag1b = serializer1.Deserialize <ComplicatedObject>(serializedPropertyBag1b);
            var actualPropertyBag1c = serializer1.Deserialize <ComplicatedObject>(serializedPropertyBag1c);
            var actualPropertyBag1d = serializer1.Deserialize <ComplicatedObject>(serializedPropertyBag1d);

            var actualPropertyBag2a = serializer1.Deserialize <ComplicatedObject>(serializedPropertyBag2a);
            var actualPropertyBag2b = serializer1.Deserialize <ComplicatedObject>(serializedPropertyBag2b);
            var actualPropertyBag2c = serializer1.Deserialize <ComplicatedObject>(serializedPropertyBag2c);
            var actualPropertyBag2d = serializer1.Deserialize <ComplicatedObject>(serializedPropertyBag2d);

            ThrowIfObjectsDiffer(null, actualPropertyBag1a);
            ThrowIfObjectsDiffer(null, actualPropertyBag1b);
            ThrowIfObjectsDiffer(null, actualPropertyBag1c);
            ThrowIfObjectsDiffer(null, actualPropertyBag1d);

            ThrowIfObjectsDiffer(null, actualPropertyBag2a);
            ThrowIfObjectsDiffer(null, actualPropertyBag2b);
            ThrowIfObjectsDiffer(null, actualPropertyBag2c);
            ThrowIfObjectsDiffer(null, actualPropertyBag2d);
        }