/// <summary>
        /// Initializes a new instance of the <see cref="SqlServerStreamConfig"/> class.
        /// </summary>
        /// <param name="name">Name of the stream.</param>
        /// <param name="accessKinds">Access the stream has.</param>
        /// <param name="defaultConnectionTimeout">Default timeout to use when connecting to SQL Server.</param>
        /// <param name="defaultCommandTimeout">Default timeout to use when running a command on SQL Server.</param>
        /// <param name="defaultSerializerRepresentation">Default <see cref="SerializerRepresentation"/> to use (used for identifier serialization).</param>
        /// <param name="defaultSerializationFormat">Default <see cref="SerializationFormat"/> to use.</param>
        /// <param name="allLocators">All <see cref="ISqlServerLocator"/>'s.</param>
        public SqlServerStreamConfig(
            string name,
            StreamAccessKinds accessKinds,
            TimeSpan defaultConnectionTimeout,
            TimeSpan defaultCommandTimeout,
            SerializerRepresentation defaultSerializerRepresentation,
            SerializationFormat defaultSerializationFormat,
            IReadOnlyCollection <ISqlServerLocator> allLocators)
        {
            name.MustForArg(nameof(name)).NotBeNullNorWhiteSpace();
            accessKinds.MustForArg(nameof(accessKinds)).NotBeEqualTo(StreamAccessKinds.None);
            defaultConnectionTimeout.TotalMilliseconds.MustForArg(Invariant($"{nameof(defaultConnectionTimeout)}.{nameof(TimeSpan.TotalMilliseconds)}")).BeGreaterThanOrEqualTo(0d);
            defaultCommandTimeout.TotalMilliseconds.MustForArg(Invariant($"{nameof(defaultCommandTimeout)}.{nameof(TimeSpan.TotalMilliseconds)}")).BeGreaterThanOrEqualTo(0d);
            defaultSerializerRepresentation.MustForArg(nameof(defaultSerializerRepresentation)).NotBeNull();
            defaultSerializationFormat.MustForArg(nameof(defaultSerializationFormat)).NotBeEqualTo(SerializationFormat.Invalid);
            allLocators.MustForArg(nameof(allLocators)).NotBeNullNorEmptyEnumerableNorContainAnyNulls();

            this.Name        = name;
            this.AccessKinds = accessKinds;
            this.DefaultConnectionTimeout        = defaultConnectionTimeout;
            this.DefaultCommandTimeout           = defaultCommandTimeout;
            this.DefaultSerializerRepresentation = defaultSerializerRepresentation;
            this.DefaultSerializationFormat      = defaultSerializationFormat;
            this.AllLocators = allLocators;
        }
示例#2
0
        /// <inheritdoc />
        public override ISerializer BuildSerializer(
            SerializerRepresentation serializerRepresentation,
            AssemblyMatchStrategy assemblyMatchStrategy = AssemblyMatchStrategy.AnySingleVersion)
        {
            if (serializerRepresentation == null)
            {
                throw new ArgumentNullException(nameof(serializerRepresentation));
            }

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

            ISerializer serializer;

            switch (serializerRepresentation.SerializationKind)
            {
            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."));
            }

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

            return(result);
        }
        public IdentifiedSerializerRepresentation GetIdAddIfNecessarySerializerRepresentation(
            SqlServerLocator resourceLocator,
            SerializerRepresentation serializerRepresentation = null,
            SerializationFormat serializationFormat           = SerializationFormat.String)
        {
            var localSerializerRepresentation = serializerRepresentation ?? this.DefaultSerializerRepresentation;

            var found = this.serializerRepresentationToIdentifiedSerializerMap.TryGetValue(serializerRepresentation, out var result);

            if (found)
            {
                return(result);
            }
            else
            {
                var id = this.Execute(
                    new GetOrAddIdentifiedSerializerRepresentationOp(resourceLocator, localSerializerRepresentation, serializationFormat));
                var item = new IdentifiedSerializerRepresentation(id, localSerializerRepresentation, serializationFormat);
                this.serializerRepresentationIdToIdentifiedSerializerMap.TryAdd(item.Id, item);
                this.serializerRepresentationToIdentifiedSerializerMap.TryAdd(item.SerializerRepresentation, item);
                var newFound = this.serializerRepresentationToIdentifiedSerializerMap.TryGetValue(serializerRepresentation, out var newResult);
                newFound.MustForOp("failedToFindSerializationRepresentationAfterAdding").BeTrue();
                return(newResult);
            }
        }
示例#4
0
 /// <summary>
 /// Sets the serialization logic to be used when reading configuration data (from files or otherwise).
 /// </summary>
 /// <param name="configurationSerializerRepresentation">The serializer representation.</param>
 /// <param name="configurationSerializerFactory">Optional serializer factory; DEFAULT is JSON.</param>
 public static void SetSerialization(SerializerRepresentation configurationSerializerRepresentation, ISerializerFactory configurationSerializerFactory = null)
 {
     lock (SyncUpdateSettings)
     {
         Config.serializerRepresentation = configurationSerializerRepresentation;
         Config.serializerFactory        = configurationSerializerFactory ?? new JsonSerializerFactory();
     }
 }
示例#5
0
 /// <summary>
 ///     Gets a settings object of the specified type.
 /// </summary>
 /// <param name="type">Type to fetch.</param>
 /// <param name="configurationSerializerRepresentation">Optional; configuration serializer representation; DEFAULT is JSON.</param>
 /// <param name="configurationSerializerFactory">Optional; configuration serializer factory; DEFAULT is JSON.</param>
 /// <returns>Deserialized configuration.</returns>
 public static object Get(Type type, SerializerRepresentation configurationSerializerRepresentation = null, ISerializerFactory configurationSerializerFactory = null)
 {
     return(ResolvedSettings.GetOrAdd(type, t =>
     {
         dynamic settingsFor = typeof(For <>).MakeGenericType(type).Construct(configurationSerializerRepresentation ?? serializerRepresentation, configurationSerializerFactory ?? serializerFactory, null);
         return settingsFor.Value;
     }));
 }
示例#6
0
 /// <summary>
 /// Setup the subject serialization to be used when packing and handing in payload object to a writer.
 /// </summary>
 /// <param name="subjectSerializerRepresentation">The subject serializer representation.</param>
 /// <param name="subjectSerializerFactory">The subject serializer factory.</param>
 public static void SetupSubjectSerialization(SerializerRepresentation subjectSerializerRepresentation, ISerializerFactory subjectSerializerFactory)
 {
     lock (SyncSerializationSettings)
     {
         SubjectSerializerRepresentation = subjectSerializerRepresentation;
         SubjectSerializerFactory        = subjectSerializerFactory;
     }
 }
示例#7
0
 /// <summary>
 /// Gets the specified configuration.
 /// </summary>
 /// <typeparam name="T">Type of configuration item.</typeparam>
 /// <param name="configurationSerializerRepresentation">Optional; configuration serializer representation; DEFAULT is JSON.</param>
 /// <param name="configurationSerializerFactory">Optional; configuration serializer factory; DEFAULT is JSON.</param>
 /// <returns>T.</returns>
 public static T Get <T>(SerializerRepresentation configurationSerializerRepresentation = null, ISerializerFactory configurationSerializerFactory = null)
 {
     return((T)ResolvedSettings.GetOrAdd(
                typeof(T),
                t =>
                new For <T>(
                    configurationSerializerRepresentation ?? serializerRepresentation,
                    configurationSerializerFactory ?? serializerFactory).Value));
 }
示例#8
0
        private static DescribedSerialization Serialize(
            SerializerRepresentation serializerRepresentation,
            SerializationFormat serializationFormat,
            object objectToSerialize)
        {
            var result = objectToSerialize.ToDescribedSerialization(serializerRepresentation, serializationFormat);

            return(result);
        }
示例#9
0
        public static void File_exists__Gets_deserialized()
        {
            // Arrange
            var expected = new Contains
            {
                Property = new DerivedProperty
                {
                    PropertyOnBase    = "propBase",
                    PropertyOnDerived = "propDerived",
                },
            };

            var configurationSerializerRepresentation = new SerializerRepresentation(SerializationKind.Json, typeof(PropertyJsonConfig).ToRepresentation());
            var serializer   = new ObcJsonSerializer(typeof(PropertyJsonConfig).ToJsonSerializationConfigurationType());
            var expectedJson = serializer.SerializeToString(expected);

            // Act - Method specified serialization.
            Config.Reset();
            var actualViaParameterMethodSpecific     = Config.Get(expected.GetType(), configurationSerializerRepresentation);
            var actualJsonViaParameterMethodSpecific = serializer.SerializeToString(actualViaParameterMethodSpecific);
            var actualViaGenericMethodSpecific       = Config.Get(expected.GetType(), configurationSerializerRepresentation);
            var actualJsonViaGenericMethodSpecific   = serializer.SerializeToString(actualViaGenericMethodSpecific);

            // Act - Default via type parameter.
            var exceptionGet = Record.Exception(() =>
            {
                Config.Reset();
                return(Config.Get(expected.GetType()));
            });

            // Act - Default via generic call.
            var exceptionGetGeneric = Record.Exception(() =>
            {
                Config.Reset();
                return(Config.Get <Contains>());
            });

            // Act - Global specified
            Config.Reset();
            Config.SetSerialization(configurationSerializerRepresentation);
            var actualViaParameterGlobal     = Config.Get(expected.GetType());
            var actualJsonViaParameterGlobal = serializer.SerializeToString(actualViaParameterGlobal);
            var actualViaGenericGlobal       = Config.Get <Contains>();
            var actualJsonViaGenericGlobal   = serializer.SerializeToString(actualViaGenericGlobal);

            // Assert
            exceptionGet.Should().NotBeNull();
            exceptionGet.InnerException.Should().NotBeNull();
            exceptionGet.InnerException.Message.Should().StartWith("Could not create an instance of type Naos.Configuration.Test.IBase. Type is an interface or abstract class and cannot be instantiated.");
            exceptionGetGeneric.Should().NotBeNull();
            exceptionGetGeneric.Message.Should().StartWith("Could not create an instance of type Naos.Configuration.Test.IBase. Type is an interface or abstract class and cannot be instantiated.");
            actualJsonViaParameterMethodSpecific.Should().Be(expectedJson);
            actualJsonViaGenericMethodSpecific.Should().Be(expectedJson);
            actualJsonViaParameterGlobal.Should().Be(expectedJson);
            actualJsonViaGenericGlobal.Should().Be(expectedJson);
        }
示例#10
0
        private static SerializerRepresentation GetSerializerRepresentation()
        {
            SerializerRepresentation defaultSerializerRepresentation;
            var configurationTypeRepresentation =
                typeof(DependencyOnlyJsonSerializationConfiguration <SqlServerJsonSerializationConfiguration, TypesToRegisterJsonSerializationConfiguration <MyObject> >).ToRepresentation();

            defaultSerializerRepresentation = new SerializerRepresentation(
                SerializationKind.Json,
                configurationTypeRepresentation);
            return(defaultSerializerRepresentation);
        }
示例#11
0
        /// <summary>
        /// Initializes a new instance of the <see cref="IdentifiedSerializerRepresentation"/> class.
        /// </summary>
        /// <param name="id">The serializer representation identifier.</param>
        /// <param name="serializerRepresentation">The serializer description.</param>
        /// <param name="serializationFormat">The serialization format.</param>
        public IdentifiedSerializerRepresentation(
            int id,
            SerializerRepresentation serializerRepresentation,
            SerializationFormat serializationFormat)
        {
            serializerRepresentation.MustForArg(nameof(serializerRepresentation)).NotBeNull();
            serializationFormat.MustForArg(nameof(serializationFormat)).NotBeEqualTo(SerializationFormat.Invalid);

            this.Id = id;
            this.SerializerRepresentation = serializerRepresentation;
            this.SerializationFormat      = serializationFormat;
        }
        /// <summary>
        /// Gets the serializer representation from identifier (first by cache and then by database).
        /// </summary>
        /// <param name="sqlServerLocator">The resource locator.</param>
        /// <param name="serializerRepresentationId">The serializer representation identifier.</param>
        /// <returns>IdentifiedSerializerRepresentation.</returns>
        public IdentifiedSerializerRepresentation GetSerializerRepresentationFromId(
            SqlServerLocator sqlServerLocator,
            int serializerRepresentationId)
        {
            var found = this.serializerRepresentationIdToIdentifiedSerializerMap.TryGetValue(serializerRepresentationId, out var result);

            if (found)
            {
                return(result);
            }
            else
            {
                var storedProcOp = StreamSchema.Sprocs.GetSerializerRepresentationFromId.BuildExecuteStoredProcedureOp(
                    this.Name,
                    serializerRepresentationId);

                var sqlProtocol = this.BuildSqlOperationsProtocol(sqlServerLocator);
                var sprocResult = sqlProtocol.Execute(storedProcOp);

                SerializationKind serializationKind = sprocResult
                                                      .OutputParameters[nameof(StreamSchema
                                                                               .Sprocs.GetSerializerRepresentationFromId.OutputParamName
                                                                               .SerializationKind)]
                                                      .GetValueOfType <SerializationKind>();
                int configTypeWithVersionId = sprocResult
                                              .OutputParameters[nameof(StreamSchema
                                                                       .Sprocs.GetSerializerRepresentationFromId.OutputParamName
                                                                       .ConfigTypeWithVersionId)]
                                              .GetValueOfType <int>();
                CompressionKind compressionKind = sprocResult
                                                  .OutputParameters[nameof(StreamSchema
                                                                           .Sprocs.GetSerializerRepresentationFromId.OutputParamName
                                                                           .CompressionKind)]
                                                  .GetValueOfType <CompressionKind>();
                SerializationFormat serializationFormat = sprocResult
                                                          .OutputParameters[nameof(StreamSchema
                                                                                   .Sprocs.GetSerializerRepresentationFromId.OutputParamName
                                                                                   .SerializationFormat)]
                                                          .GetValueOfType <SerializationFormat>();

                var configType = this.GetTypeById(sqlServerLocator, configTypeWithVersionId, true);

                var rep  = new SerializerRepresentation(serializationKind, configType.WithVersion, compressionKind);
                var item = new IdentifiedSerializerRepresentation(serializerRepresentationId, rep, serializationFormat);

                this.serializerRepresentationIdToIdentifiedSerializerMap.TryAdd(item.Id, item);
                this.serializerRepresentationToIdentifiedSerializerMap.TryAdd(item.SerializerRepresentation, item);
                var newFound = this.serializerRepresentationIdToIdentifiedSerializerMap.TryGetValue(serializerRepresentationId, out var newResult);
                newFound.MustForOp("failedToFindSerializationRepresentationAfterAdding").BeTrue();
                return(newResult);
            }
        }
示例#13
0
        public SqlServerStreamConfig DeepCloneWithDefaultSerializerRepresentation(SerializerRepresentation defaultSerializerRepresentation)
        {
            var result = new SqlServerStreamConfig(
                this.Name?.DeepClone(),
                this.AccessKinds.DeepClone(),
                this.DefaultConnectionTimeout.DeepClone(),
                this.DefaultCommandTimeout.DeepClone(),
                defaultSerializerRepresentation,
                this.DefaultSerializationFormat.DeepClone(),
                this.AllLocators?.DeepClone());

            return(result);
        }
示例#14
0
 /// <summary>
 /// Gets the specified configuration.
 /// </summary>
 /// <typeparam name="T">Type of configuration item.</typeparam>
 /// <param name="name">Name of the resource.</param>
 /// <param name="configurationSerializerRepresentation">Optional; configuration serializer representation; DEFAULT is JSON.</param>
 /// <param name="configurationSerializerFactory">Optional; configuration serializer factory; DEFAULT is JSON.</param>
 /// <returns>T.</returns>
 public static T GetByName <T>(
     string name,
     SerializerRepresentation configurationSerializerRepresentation = null,
     ISerializerFactory configurationSerializerFactory = null)
 {
     return((T)ResolvedByNameSettings.GetOrAdd(
                name,
                t =>
                new For <T>(
                    configurationSerializerRepresentation ?? serializerRepresentation,
                    configurationSerializerFactory ?? serializerFactory,
                    name).Value));
 }
        /// <summary>
        /// Initializes a new instance of the <see cref="GetOrAddIdentifiedSerializerRepresentationOp"/> class.
        /// </summary>
        /// <param name="specifiedResourceLocator">The stream locator to inspect.</param>
        /// <param name="serializerRepresentation">The serializer representation.</param>
        /// <param name="serializationFormat">The serialization format.</param>
        public GetOrAddIdentifiedSerializerRepresentationOp(
            IResourceLocator specifiedResourceLocator,
            SerializerRepresentation serializerRepresentation,
            SerializationFormat serializationFormat)
        {
            specifiedResourceLocator.MustForArg(nameof(specifiedResourceLocator)).NotBeNull();
            serializerRepresentation.MustForArg(nameof(serializerRepresentation)).NotBeNull();
            serializationFormat.MustForArg(nameof(serializationFormat)).NotBeEqualTo(SerializationFormat.Invalid);

            this.SpecifiedResourceLocator = specifiedResourceLocator;
            this.SerializerRepresentation = serializerRepresentation;
            this.SerializationFormat      = serializationFormat;
        }
        /// <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);
        }
示例#17
0
        public static DescribedSerializationBase ToDescribedSerialization <T>(
            this T objectToPackageIntoDescribedSerialization,
            SerializerRepresentation serializerRepresentation,
            SerializationFormat serializationFormat,
            VersionMatchStrategy assemblyVersionMatchStrategy = VersionMatchStrategy.AnySingleVersion)
        {
            var result = objectToPackageIntoDescribedSerialization.ToDescribedSerializationUsingSpecificFactory(
                serializerRepresentation,
                SerializerFactory.Instance,
                serializationFormat,
                assemblyVersionMatchStrategy);

            return(result);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="LogWriterConfigBase"/> class.
        /// </summary>
        /// <param name="logInclusionKindToOriginsMap">The log items to log.</param>
        /// <param name="logItemPropertiesToIncludeInLogMessage">The properties/aspects of an <see cref="LogItem"/> to include when building a log message.</param>
        /// <param name="logItemSerializerRepresentation">Optional serializer representation; DEFAULT is JSON.</param>
        protected LogWriterConfigBase(
            IReadOnlyDictionary <LogItemKind, IReadOnlyCollection <string> > logInclusionKindToOriginsMap,
            LogItemPropertiesToIncludeInLogMessage logItemPropertiesToIncludeInLogMessage,
            SerializerRepresentation logItemSerializerRepresentation = null)
        {
            new { logInclusionKindToOriginsMap }.AsArg().Must().NotBeNull();
            this.LogInclusionKindToOriginsMap = logInclusionKindToOriginsMap;

            this.LogItemPropertiesToIncludeInLogMessage     = logItemPropertiesToIncludeInLogMessage;
            this.LogInclusionKindToOriginsMapFriendlyString = GenerateFriendlyStringFromLogInclusionKindToOriginsMap(this.LogInclusionKindToOriginsMap);

            this.LogItemSerializerRepresentation = logItemSerializerRepresentation
                                                   ?? new SerializerRepresentation(
                SerializationKind.Json,
                typeof(LoggingJsonSerializationConfiguration).ToRepresentation());
        }
示例#19
0
            /// <summary>
            /// Initializes a new instance of the <see cref="For{T}"/> class.
            /// </summary>
            /// <param name="configurationSerializerRepresentation">The configuration serializer representation.</param>
            /// <param name="configurationSerializerFactory">The configuration serializer factory.</param>
            /// <param name="keyOverride">The optional specified key to use; DEFAULT is null and will build a key from the supplied <typeparamref name="T"/>.</param>
            public For(SerializerRepresentation configurationSerializerRepresentation, ISerializerFactory configurationSerializerFactory, string keyOverride = null)
            {
                this.Key = keyOverride ?? BuildKey();
                var configSetting = GetSerializedSetting(this.Key);

                var serializer = configurationSerializerFactory.BuildSerializer(configurationSerializerRepresentation);

                if (!string.IsNullOrWhiteSpace(configSetting))
                {
                    this.Value = serializer.Deserialize <T>(configSetting);
                }
                else
                {
                    throw new FileNotFoundException(FormattableString.Invariant($"Could not find config for: {typeof(T).AssemblyQualifiedName}."));
                }
            }
示例#20
0
        public static void ToDescribedSerialization___Valid___Just_passes_to_specific_factory_version_with_default_factory()
        {
            // Arrange
            var objectToPackageIntoDescribedSerialization = A.Dummy <string>();
            var serializerRepresentation = new SerializerRepresentation(SerializationKind.Json, typeof(NullJsonSerializationConfiguration).ToRepresentation(), CompressionKind.None);

            // Act
            var describedSerialization = objectToPackageIntoDescribedSerialization.ToDescribedSerialization(serializerRepresentation, SerializationFormat.String);

            // Assert
            describedSerialization.Should().NotBeNull();
            describedSerialization.Should().BeOfType <StringDescribedSerialization>();
            describedSerialization.PayloadTypeRepresentation.Should().Be(objectToPackageIntoDescribedSerialization.GetType().ToRepresentation());
            ((StringDescribedSerialization)describedSerialization).SerializedPayload.Should().Be("\"" + objectToPackageIntoDescribedSerialization + "\"");
            describedSerialization.SerializerRepresentation.Should().Be(serializerRepresentation);
        }
示例#21
0
        /// <inheritdoc />
        public override ISerializer BuildSerializer(
            SerializerRepresentation serializerRepresentation,
            VersionMatchStrategy assemblyVersionMatchStrategy = VersionMatchStrategy.AnySingleVersion)
        {
            if (serializerRepresentation == null)
            {
                throw new ArgumentNullException(nameof(serializerRepresentation));
            }

            ISerializer result;

            if (CachedSerializerRepresentationToSerializerMap.TryGetValue(serializerRepresentation, out ConcurrentDictionary <VersionMatchStrategy, ISerializer> assemblyVersionMatchStrategyToSerializerMap))
            {
                if (assemblyVersionMatchStrategyToSerializerMap.TryGetValue(assemblyVersionMatchStrategy, out result))
                {
                    return(result);
                }
            }

            ISerializer serializer;

            switch (serializerRepresentation.SerializationKind)
            {
            case SerializationKind.Bson:
                serializer = BsonSerializerFactory.BuildSerializer(serializerRepresentation, assemblyVersionMatchStrategy);
                break;

            case SerializationKind.Json:
                serializer = JsonSerializerFactory.BuildSerializer(serializerRepresentation, assemblyVersionMatchStrategy);
                break;

            case SerializationKind.PropertyBag:
                serializer = PropertyBagSerializerFactory.BuildSerializer(serializerRepresentation, assemblyVersionMatchStrategy);
                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 <VersionMatchStrategy, ISerializer>());

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

            return(result);
        }
示例#22
0
        private static Tuple <string, T> SerializeAndDeserialize <T>(
            SerializerRepresentation serializerRepresentation,
            SerializationFormat serializationFormat,
            T objectToSerialize)
        {
            var serializer = SerializerFactory.Instance.BuildSerializer(serializerRepresentation);

            var describedSerialization = objectToSerialize.ToDescribedSerializationUsingSpecificSerializer(serializer, serializationFormat);

            var deserializedObject = (T)describedSerialization.DeserializePayloadUsingSpecificSerializer(serializer);

            // note that we cannot return a ValueTuple (DescribedSerialization DescribedSerialization, T actual)
            // here because ValueTuple is not [Serializable]
            var result = new Tuple <string, T>(describedSerialization.SerializedPayload, deserializedObject);

            return(result);
        }
示例#23
0
        public static void FromDescribedSerializationGeneric___Valid___Just_passes_to_specific_factory_version_with_default_factory()
        {
            // Arrange
            var expected = A.Dummy <string>();
            var serializerRepresentation = new SerializerRepresentation(SerializationKind.Json, typeof(NullJsonSerializationConfiguration).ToRepresentation(), CompressionKind.None);
            var payload = "\"" + expected + "\"";
            var describedSerialization = new StringDescribedSerialization(
                expected.GetType().ToRepresentation(),
                serializerRepresentation,
                payload);

            // Act
            var actual = describedSerialization.DeserializePayload <string>();

            // Assert
            actual.Should().NotBeNull();
            actual.Should().Be(expected);
        }
示例#24
0
        public static void BuildSerializer___Json___Gets_Json_serializer()
        {
            // Arrange
            var serializerRepresentation = new SerializerRepresentation(
                SerializationKind.Json,
                null,
                CompressionKind.None);

            // Act
            var serializer     = SerializerFactory.Instance.BuildSerializer(serializerRepresentation);
            var jsonSerializer = new JsonSerializerFactory(CompressorFactory.Instance).BuildSerializer(serializerRepresentation);

            // Assert
            serializer.Should().NotBeNull();
            serializer.Should().BeOfType <ObcJsonSerializer>();
            jsonSerializer.Should().NotBeNull();
            jsonSerializer.Should().BeOfType <ObcJsonSerializer>();
        }
示例#25
0
        public static void ToDescribedSerializationWithSpecificSerializer___Valid_object_and_serializer___Works()
        {
            // Arrange
            string objectToPackageIntoDescribedSerialization = null;
            var    serializerRepresentation = new SerializerRepresentation(SerializationKind.Json, typeof(NullJsonSerializationConfiguration).ToRepresentation(), CompressionKind.None);

            // Act
            var describedSerialization = objectToPackageIntoDescribedSerialization.ToDescribedSerializationUsingSpecificFactory(
                serializerRepresentation,
                SerializerFactory.Instance,
                SerializationFormat.String);

            // Assert
            describedSerialization.Should().NotBeNull();
            describedSerialization.Should().BeOfType <StringDescribedSerialization>();
            describedSerialization.PayloadTypeRepresentation.Should().Be(typeof(string).ToRepresentation());
            ((StringDescribedSerialization)describedSerialization).SerializedPayload.Should().Be("null");
            describedSerialization.SerializerRepresentation.Should().Be(serializerRepresentation);
        }
示例#26
0
        public static void FromDescribedSerializationWithSpecificFactory___Null_object___Works()
        {
            // Arrange
            string expected = null;
            var    serializerRepresentation = new SerializerRepresentation(SerializationKind.Json, typeof(NullJsonSerializationConfiguration).ToRepresentation(), CompressionKind.None);
            var    payload = "null";
            var    describedSerialization = new StringDescribedSerialization(
                typeof(string).ToRepresentation(),
                serializerRepresentation,
                payload);

            // Act
            var actual = DomainExtensions.DeserializePayloadUsingSpecificFactory(
                describedSerialization,
                SerializerFactory.Instance);

            // Assert
            actual.Should().Be(expected);
        }
示例#27
0
        private static void RunVerification <T>(
            SerializerRepresentation serializerRepresentation,
            SerializationFormat serializationFormat,
            RoundtripSerializationVerification <T> verificationCallback,
            AppDomainScenarios appDomainScenario,
            string serializedPayload,
            T deserializedObject)
        {
            new { verificationCallback }.AsArg().Must().NotBeNull();

            try
            {
                verificationCallback(serializedPayload, serializationFormat, deserializedObject);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(Invariant($"Failed to roundtrip specified object to/from {serializerRepresentation.SerializationKind} {serializationFormat} using {serializerRepresentation.SerializationConfigType.ResolveFromLoadedTypes().ToStringReadable()} with the App Domain Scenario '{appDomainScenario}'.  Serialized payload is: {serializedPayload}.  Deserialized object is: {deserializedObject}."), ex);
            }
        }
示例#28
0
        /// <summary>
        ///     Resets settings to the default behavior.
        /// </summary>
        /// <param name="rootDirectoryOverride">Optional root directory to look in override; DEFAULT is (AppDomain.CurrentDomain.BaseDirectory).</param>
        /// <param name="configDirectoryNameOverride">Optional config directory override; DEFAULT is ".config".</param>
        public static void Reset(string rootDirectoryOverride = null, string configDirectoryNameOverride = DefaultConfigDirectoryName)
        {
            lock (SyncUpdateSettings)
            {
                var baseDirectory = rootDirectoryOverride ?? AppDomain.CurrentDomain.BaseDirectory;
                var directoryName = configDirectoryNameOverride ?? DefaultConfigDirectoryName;

                ResolvedSettings.Clear();
                ResolvedByNameSettings.Clear();
                SettingsDirectory    = Path.Combine(baseDirectory, directoryName);
                GetSerializedSetting = GetSerializedSettingDefault;
                sources    = DefaultSources.Value;
                precedence = new Lazy <string[]>(DefaultPrecedence);
                serializerRepresentation = new SerializerRepresentation(
                    SerializationKind.Json,
                    typeof(AttemptOnUnregisteredTypeJsonSerializationConfiguration <NullJsonSerializationConfiguration>).ToRepresentation());
                serializerFactory = new JsonSerializerFactory();
            }
        }
示例#29
0
        public static void FromDescribedSerializationWithSpecificFactory___All_valid___Works()
        {
            // Arrange
            var expected = A.Dummy <string>();
            var serializerRepresentation = new SerializerRepresentation(SerializationKind.Json, typeof(NullJsonSerializationConfiguration).ToRepresentation(), CompressionKind.None);
            var payload = "\"" + expected + "\"";
            var describedSerialization = new StringDescribedSerialization(
                expected.GetType().ToRepresentation(),
                serializerRepresentation,
                payload);

            // Act
            var actual = DomainExtensions.DeserializePayloadUsingSpecificFactory(
                describedSerialization,
                SerializerFactory.Instance);

            // Assert
            actual.Should().NotBeNull();
            actual.Should().Be(expected);
        }
示例#30
0
        public static void ToDescribedSerializationWithSpecificFactory___All_valid___Works()
        {
            // Arrange
            var objectToPackageIntoDescribedSerialization = A.Dummy <string>();
            var serializerRepresentation = new SerializerRepresentation(SerializationKind.Json, typeof(NullJsonSerializationConfiguration).ToRepresentation(), CompressionKind.None);

            // Act
            var describedSerialization = DomainExtensions.ToDescribedSerializationUsingSpecificFactory(
                objectToPackageIntoDescribedSerialization,
                serializerRepresentation,
                SerializerFactory.Instance,
                SerializationFormat.String);

            // Assert
            describedSerialization.Should().NotBeNull();
            describedSerialization.Should().BeOfType <StringDescribedSerialization>();
            describedSerialization.PayloadTypeRepresentation.Should().Be(objectToPackageIntoDescribedSerialization.GetType().ToRepresentation());
            ((StringDescribedSerialization)describedSerialization).SerializedPayload.Should().Be("\"" + objectToPackageIntoDescribedSerialization + "\"");
            describedSerialization.SerializerRepresentation.Should().Be(serializerRepresentation);
        }