/// <summary>
        /// Writes the json.
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="value">The value.</param>
        /// <param name="serializer">The serializer.</param>
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var serialize = true;

            if (_jsonSerializer.PreserveReferences)
            {
                var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();
                using (var scopeManager = ScopeManager <ReferenceManager> .GetScopeManager(scopeName))
                {
                    var referenceManager = scopeManager.ScopeObject;

                    var referenceInfo = referenceManager.GetInfo(value);
                    if (referenceInfo != null && !referenceInfo.IsFirstUsage)
                    {
                        writer.WriteStartObject();
                        writer.WritePropertyName(Json.JsonSerializer.GraphRefId);
                        writer.WriteValue(referenceInfo.Id);
                        writer.WriteEndObject();

                        serialize = false;
                    }
                }
            }

            if (serialize)
            {
                _jsonSerializer.Serialize((ModelBase)value, writer);
            }
        }
Exemple #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ModelBase"/> class.
        /// <para />
        /// Only constructor for the ModelBase.
        /// </summary>
        /// <param name="info">SerializationInfo object, null if this is the first time construction.</param>
        /// <param name="context">StreamingContext object, simple pass a default new StreamingContext() if this is the first time construction.</param>
        /// <remarks>
        /// Call this method, even when constructing the object for the first time (thus not deserializing).
        /// </remarks>
        protected ModelBase(SerializationInfo info, StreamingContext context)
        {
            Initialize();

            // Make sure this is not a first time call or custom call with null
            if (info != null)
            {
                _serializationInfo = info;

                // Too bad we cannot put this in the BinarySerializer, but BinarySerialization works bottom => top. We
                // do need the GraphId though, thus we are setting it here
                var scopeName = SerializationContextHelper.GetSerializationScopeName();
                using (var scopeManager = ScopeManager <SerializationContextScope <BinarySerializationContextInfo> > .GetScopeManager(scopeName))
                {
                    var referenceManager = scopeManager.ScopeObject.ReferenceManager;

                    int?graphId = null;

                    try
                    {
                        // Binary
                        graphId = (int)info.GetValue("GraphId", typeof(int));
                    }
                    catch (Exception)
                    {
                        // Swallow
                    }

                    if (graphId.HasValue)
                    {
                        referenceManager.RegisterManually(graphId.Value, this);
                    }
                }
            }
        }
Exemple #3
0
        private void OnDeserialized(StreamingContext context)
        {
            IsDeserializedDataAvailable = true;

            if (_serializationInfo == null)
            {
                // Probably a custom serializer which will populate us in a different way
                return;
            }

            var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();

            using (var scopeManager = ScopeManager <SerializationScope> .GetScopeManager(scopeName, () => new SerializationScope(SerializationFactory.GetBinarySerializer(), SerializationConfiguration)))
            {
                var serializer    = scopeManager.ScopeObject.Serializer;
                var configuration = scopeManager.ScopeObject.Configuration;

                var dependencyResolver = this.GetDependencyResolver();
                var serializationContextInfoFactory = dependencyResolver.Resolve <ISerializationContextInfoFactory>(serializer.GetType());

                var serializationContext = serializationContextInfoFactory.GetSerializationContextInfo(serializer, this, _serializationInfo, configuration);
                serializer.Deserialize(this, serializationContext, configuration);
            }

            DeserializationSucceeded = true;
        }
Exemple #4
0
        private void OnDeserialized(StreamingContext context)
        {
#if NET || NETCORE
            if (_serializationInfo is null)
            {
                // Probably a custom serializer which will populate us in a different way
                return;
            }

            var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();
            using (var scopeManager = ScopeManager <SerializationScope> .GetScopeManager(scopeName, BinarySerializationScopeFactory))
            {
                var serializer    = scopeManager.ScopeObject.Serializer;
                var configuration = scopeManager.ScopeObject.Configuration;

                var dependencyResolver = this.GetDependencyResolver();
                var serializationContextInfoFactory = dependencyResolver.Resolve <ISerializationContextInfoFactory>(serializer.GetType());

                var serializationContext = serializationContextInfoFactory.GetSerializationContextInfo(serializer, this, _serializationInfo, configuration);
                serializer.Deserialize(this, serializationContext, configuration);
            }
#else
            throw new NotSupportedInPlatformException("It's adviced to no longer use binary serialization on this platform");
#endif
        }
Exemple #5
0
        /// <summary>
        /// Gets the namespace for the specified type.
        /// </summary>
        /// <param name="type">The type.</param>
        /// <param name="preferredPrefix">The preferred prefix.</param>
        /// <returns>The xml namespace.</returns>
        /// <exception cref="ArgumentNullException">The <paramref name="type" /> is <c>null</c>.</exception>
        /// <exception cref="ArgumentException">The <paramref name="preferredPrefix"/> is <c>null</c> or whitespace.</exception>
        public XmlNamespace GetNamespace(Type type, string preferredPrefix)
        {
            Argument.IsNotNull("type", type);

            var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();

            using (var serializationManagerScopeManager = ScopeManager <ReferenceManager> .GetScopeManager(scopeName))
            {
                EnsureSubscribedToScope(serializationManagerScopeManager, scopeName);

                var scopeInfo = _scopeInfo[scopeName];
                return(scopeInfo.GetNamespace(type, preferredPrefix));
            }
        }
        /// <summary>
        /// Converts an object into its XML representation.
        /// </summary>
        /// <param name="writer">The <see cref="T:System.Xml.XmlWriter"/> stream to which the object is serialized.</param>
        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            // Note: although this XmlWriter doesn't have settings, it has an internal writer that
            // is used (with the correct settings). For more details, see the source at:
            // https://referencesource.microsoft.com/#System.Runtime.Serialization/System/Runtime/Serialization/XmlSerializableWriter.cs

            var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();

            using (var scopeManager = ScopeManager <SerializationScope> .GetScopeManager(scopeName, XmlSerializationScopeFactory))
            {
                var serializer = scopeManager.ScopeObject.Serializer;
                serializer.Serialize(this, new XmlSerializationContextInfo(writer, this), scopeManager.ScopeObject.Configuration);
            }
        }
Exemple #7
0
        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();
            using (var scopeManager = ScopeManager<SerializationScope>.GetScopeManager(scopeName, () => new SerializationScope(SerializationFactory.GetBinarySerializer(), null)))
            {
                var serializer = scopeManager.ScopeObject.Serializer;
                var configuration = scopeManager.ScopeObject.Configuration;

                var dependencyResolver = this.GetDependencyResolver();
                var serializationContextInfoFactory = dependencyResolver.Resolve<ISerializationContextInfoFactory>(serializer.GetType());

                var serializationContext = serializationContextInfoFactory.GetSerializationContextInfo(serializer, this, info, configuration);
                serializer.Serialize(this, serializationContext, configuration);
            }
        }
        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();

            using (var scopeManager = ScopeManager <ISerializer> .GetScopeManager(scopeName, SerializationFactory.GetBinarySerializer))
            {
                var serializer = scopeManager.ScopeObject;

                var dependencyResolver = this.GetDependencyResolver();
                var serializationContextInfoFactory = dependencyResolver.Resolve <ISerializationContextInfoFactory>(serializer.GetType());

                var serializationContext = serializationContextInfoFactory.GetSerializationContextInfo(serializer, this, info);
                serializer.Serialize(this, serializationContext);
            }
        }
Exemple #9
0
        /// <summary>
        /// Generates an object from its XML representation.
        /// </summary>
        /// <param name="reader">The <see cref="T:System.Xml.XmlReader"/> stream from which the object is deserialized.</param>
        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            if (reader.IsEmptyElement && !reader.HasAttributes)
            {
                return;
            }

            var contextInfo = new XmlSerializationContextInfo(reader, this);

            var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();

            using (var scopeManager = ScopeManager <SerializationScope> .GetScopeManager(scopeName, () => new SerializationScope(SerializationFactory.GetXmlSerializer(), SerializationConfiguration)))
            {
                var serializer = scopeManager.ScopeObject.Serializer;
                serializer.Deserialize(this, contextInfo, scopeManager.ScopeObject.Configuration);
            }
        }
Exemple #10
0
        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
        {
#if NET || NETCORE
            var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();
            using (var scopeManager = ScopeManager <SerializationScope> .GetScopeManager(scopeName, BinarySerializationScopeFactory))
            {
                var serializer    = scopeManager.ScopeObject.Serializer;
                var configuration = scopeManager.ScopeObject.Configuration;

                var dependencyResolver = this.GetDependencyResolver();
                var serializationContextInfoFactory = dependencyResolver.Resolve <ISerializationContextInfoFactory>(serializer.GetType());

                var serializationContext = serializationContextInfoFactory.GetSerializationContextInfo(serializer, this, info, configuration);
                serializer.Serialize(this, serializationContext, configuration);
            }
#else
            throw new NotSupportedInPlatformException("It's adviced to no longer use binary serialization on this platform");
#endif
        }
Exemple #11
0
        /// <summary>
        /// Converts an object into its XML representation.
        /// </summary>
        /// <param name="writer">The <see cref="T:System.Xml.XmlWriter"/> stream to which the object is serialized.</param>
        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();

            using (var scopeManager = ScopeManager <SerializationScope> .GetScopeManager(scopeName, () => new SerializationScope(SerializationFactory.GetXmlSerializer(), SerializationConfiguration)))
            {
                var type       = GetType();
                var element    = new XElement(type.Name);
                var serializer = scopeManager.ScopeObject.Serializer;
                serializer.Serialize(this, new XmlSerializationContextInfo(element, this), scopeManager.ScopeObject.Configuration);

                // The serializer gives us the full element, but we only need the actual content. According to
                // http://stackoverflow.com/questions/3793/best-way-to-get-innerxml-of-an-xelement, this method is the fastest:
                var reader = element.CreateReader();
                reader.MoveToContent();

                // CTL-710: fix attributes on top level elements
                if (reader.HasAttributes)
                {
                    for (int i = 0; i < reader.AttributeCount; i++)
                    {
                        reader.MoveToAttribute(i);

                        var attributePrefix    = reader.Prefix;
                        var attributeLocalName = reader.LocalName;
                        var attributeNs        = reader.NamespaceURI;
                        var attributeValue     = reader.Value;

                        writer.WriteAttributeString(attributePrefix, attributeLocalName, attributeNs, attributeValue);
                    }

                    reader.MoveToElement();
                }

                var elementContent = reader.ReadInnerXml();

                writer.WriteRaw(elementContent);
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ModelBase"/> class.
        /// <para />
        /// Only constructor for the ModelBase.
        /// </summary>
        /// <param name="info">SerializationInfo object, null if this is the first time construction.</param>
        /// <param name="context">StreamingContext object, simple pass a default new StreamingContext() if this is the first time construction.</param>
        /// <remarks>
        /// Call this method, even when constructing the object for the first time (thus not deserializing).
        /// </remarks>
        protected ModelBase(SerializationInfo info, StreamingContext context)
        {
            OnInitializing();

            Initialize();

            // Make sure this is not a first time call or custom call with null
            if (info == null)
            {
                FinishInitializationAfterConstructionOrDeserialization();
            }
            else
            {
                _serializationInfo = info;

                // Too bad we cannot put this in the BinarySerializer, but BinarySerialization works bottom => top. We
                // do need the GraphId though, thus we are setting it here
                var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();
                using (var scopeManager = ScopeManager <ReferenceManager> .GetScopeManager(scopeName))
                {
                    var referenceManager = scopeManager.ScopeObject;

                    try
                    {
                        var graphId = (int)info.GetValue("GraphId", typeof(int));
                        referenceManager.RegisterManually(graphId, this);
                    }
                    catch (Exception)
                    {
                        // Swallow
                    }
                }
            }

            OnInitialized();
        }
Exemple #13
0
        /// <summary>
        /// Deserializes the specified model from the json reader.
        /// </summary>
        /// <param name="modelType">Type of the model.</param>
        /// <param name="jsonReader">The json reader.</param>
        /// <param name="configuration">The configuration.</param>
        /// <returns>
        /// The model.
        /// </returns>
        public object Deserialize(Type modelType, JsonReader jsonReader, ISerializationConfiguration configuration)
        {
            Dictionary <string, JProperty> jsonProperties = null;
            JArray jsonArray = null;

            if (modelType.ImplementsInterfaceEx <ICustomJsonSerializable>())
            {
                var customModel = CreateModelInstance(modelType) as ICustomJsonSerializable;
                if (customModel == null)
                {
                    throw Log.ErrorAndCreateException <SerializationException>($"'{modelType.GetSafeFullName(false)}' implements ICustomJsonSerializable but could not be instantiated");
                }

                customModel.Deserialize(jsonReader);
                return(customModel);
            }

            if (ShouldSerializeAsCollection(modelType))
            {
                jsonArray = JArray.Load(jsonReader);
            }
            else if (ShouldExternalSerializerHandleMember(modelType))
            {
                return(Convert.ChangeType(jsonReader.Value, modelType, CultureInfo.CurrentCulture));
            }
            else
            {
                if (jsonReader.TokenType == JsonToken.Null)
                {
                    return(null);
                }

                var jsonObject = JObject.Load(jsonReader);
                jsonProperties = jsonObject.Properties().ToDictionary(x => x.Name, x => x);

                if (PreserveReferences)
                {
                    if (jsonProperties.ContainsKey(GraphRefId))
                    {
                        var graphId = (int)jsonProperties[GraphRefId].Value;

                        var scopeName = SerializationContextHelper.GetSerializationReferenceManagerScopeName();
                        using (var scopeManager = ScopeManager <ReferenceManager> .GetScopeManager(scopeName))
                        {
                            var referenceManager = scopeManager.ScopeObject;

                            var referenceInfo = referenceManager.GetInfoById(graphId);
                            if (referenceInfo != null)
                            {
                                return(referenceInfo.Instance);
                            }
                        }
                    }
                }

                if (jsonProperties.ContainsKey(TypeName))
                {
                    var modelTypeOverrideValue = (string)jsonProperties[TypeName].Value;
                    var modelTypeOverride      = TypeCache.GetTypeWithoutAssembly(modelTypeOverrideValue);
                    if (modelTypeOverride == null)
                    {
                        Log.Warning("Object was serialized as '{0}', but the type is not available. Using original type '{1}'", modelTypeOverrideValue, modelType.GetSafeFullName(false));
                    }
                    else
                    {
                        modelType = modelTypeOverride;
                    }
                }
            }

            var model = CreateModelInstance(modelType);

            using (GetCurrentSerializationScopeManager(configuration))
            {
                configuration = GetCurrentSerializationConfiguration(configuration);

                using (var context = GetContext(model, modelType, jsonReader, null, SerializationContextMode.Deserialization,
                                                jsonProperties, jsonArray, configuration))
                {
                    model = base.Deserialize(model, context.Context, configuration);
                }
            }

            return(model);
        }