private void SerializeValue(JsonWriter writer, object value, JsonContract valueContract, JsonProperty member, JsonContract collectionValueContract) { JsonConverter converter = (member != null) ? member.Converter : null; if (value == null) { writer.WriteNull(); return; } if ((converter != null || ((converter = valueContract.Converter) != null) || ((converter = this.Serializer.GetMatchingConverter(valueContract.UnderlyingType)) != null) || ((converter = valueContract.InternalConverter) != null)) && converter.CanWrite) { this.SerializeConvertable(writer, converter, value, valueContract); return; } switch (valueContract.ContractType) { case JsonContractType.Object: this.SerializeObject(writer, value, (JsonObjectContract)valueContract, member, collectionValueContract); break; case JsonContractType.Array: JsonArrayContract arrayContract = (JsonArrayContract)valueContract; this.SerializeList(writer, arrayContract.CreateWrapper(value), arrayContract, member, collectionValueContract); break; case JsonContractType.Primitive: this.SerializePrimitive(writer, value, (JsonPrimitiveContract)valueContract, member, collectionValueContract); break; case JsonContractType.String: this.SerializeString(writer, value, (JsonStringContract)valueContract); break; case JsonContractType.Dictionary: JsonDictionaryContract dictionaryContract = (JsonDictionaryContract)valueContract; this.SerializeDictionary(writer, dictionaryContract.CreateWrapper(value), dictionaryContract, member, collectionValueContract); break; #if !(NET35 || NET20 || WINDOWS_PHONE) case JsonContractType.Dynamic: this.SerializeDynamic(writer, (IDynamicMetaObjectProvider)value, (JsonDynamicContract)valueContract); break; #endif #if !SILVERLIGHT && !PocketPC case JsonContractType.Serializable: this.SerializeISerializable(writer, (ISerializable)value, (JsonISerializableContract)valueContract, member, collectionValueContract); break; #endif case JsonContractType.Linq: ((JToken)value).WriteTo(writer, (this.Serializer.Converters != null) ? this.Serializer.Converters.ToArray() : null); break; } }
/// <summary> /// Creates a <see cref="JsonDictionaryContract"/> for the given type. /// </summary> /// <param name="objectType">Type of the object.</param> /// <returns>A <see cref="JsonDictionaryContract"/> for the given type.</returns> protected virtual JsonDictionaryContract CreateDictionaryContract(Type objectType) { JsonDictionaryContract contract = new JsonDictionaryContract(objectType); InitializeContract(contract); contract.PropertyNameResolver = ResolvePropertyName; return(contract); }
private void SerializeDictionary(JsonWriter writer, IWrappedDictionary values, JsonDictionaryContract contract, JsonProperty member, JsonContract collectionValueContract) { contract.InvokeOnSerializing(values.UnderlyingDictionary, this.Serializer.Context); this._serializeStack.Add(values.UnderlyingDictionary); writer.WriteStartObject(); bool isReference = contract.IsReference ?? this.HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Objects); if (isReference) { writer.WritePropertyName(JsonTypeReflector.IdPropertyName); writer.WriteValue(this.Serializer.ReferenceResolver.GetReference(this, values.UnderlyingDictionary)); } if (this.ShouldWriteType(TypeNameHandling.Objects, contract, member, collectionValueContract)) { this.WriteTypeProperty(writer, values.UnderlyingDictionary.GetType()); } if (contract.DictionaryValueContract == null) { contract.DictionaryValueContract = this.Serializer.ContractResolver.ResolveContract(contract.DictionaryValueType ?? typeof(object)); } JsonContract dictionaryValueContract = (contract.DictionaryValueContract.UnderlyingType.IsSealed) ? contract.DictionaryValueContract : null; int initialDepth = writer.Top; // Mono Unity 3.0 fix IDictionary d = values; foreach (DictionaryEntry entry in d) { string propertyName = this.GetPropertyName(entry); propertyName = (contract.PropertyNameResolver != null) ? contract.PropertyNameResolver(propertyName) : propertyName; try { object value = entry.Value; JsonContract valueContract = dictionaryValueContract ?? this.GetContractSafe(value); if (this.ShouldWriteReference(value, null, valueContract)) { writer.WritePropertyName(propertyName); this.WriteReference(writer, value); } else { if (!this.CheckForCircularReference(value, null, contract)) { continue; } writer.WritePropertyName(propertyName); this.SerializeValue(writer, value, valueContract, null, contract.DictionaryValueContract); } } catch (Exception ex) { if (this.IsErrorHandled(values.UnderlyingDictionary, contract, propertyName, ex)) { this.HandleError(writer, initialDepth); } else { throw; } } } writer.WriteEndObject(); this._serializeStack.RemoveAt(this._serializeStack.Count - 1); contract.InvokeOnSerialized(values.UnderlyingDictionary, this.Serializer.Context); }
private void SerializeDictionary(JsonWriter writer, IWrappedDictionary values, JsonDictionaryContract contract, JsonProperty member, JsonContract collectionValueContract) { contract.InvokeOnSerializing(values.UnderlyingDictionary, Serializer.Context); _serializeStack.Add(values.UnderlyingDictionary); writer.WriteStartObject(); bool isReference = contract.IsReference ?? HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Objects); if (isReference) { writer.WritePropertyName(JsonTypeReflector.IdPropertyName); writer.WriteValue(Serializer.ReferenceResolver.GetReference(this, values.UnderlyingDictionary)); } if (ShouldWriteType(TypeNameHandling.Objects, contract, member, collectionValueContract)) { WriteTypeProperty(writer, values.UnderlyingDictionary.GetType()); } if (contract.DictionaryValueContract == null) contract.DictionaryValueContract = Serializer.ContractResolver.ResolveContract(contract.DictionaryValueType ?? typeof(object)); JsonContract dictionaryValueContract = (contract.DictionaryValueContract.UnderlyingType.IsSealed) ? contract.DictionaryValueContract : null; int initialDepth = writer.Top; // Mono Unity 3.0 fix IDictionary d = values; foreach (DictionaryEntry entry in d) { string propertyName = GetPropertyName(entry); propertyName = (contract.PropertyNameResolver != null) ? contract.PropertyNameResolver(propertyName) : propertyName; try { object value = entry.Value; JsonContract valueContract = dictionaryValueContract ?? GetContractSafe(value); if (ShouldWriteReference(value, null, valueContract)) { writer.WritePropertyName(propertyName); WriteReference(writer, value); } else { if (!CheckForCircularReference(value, null, contract)) continue; writer.WritePropertyName(propertyName); SerializeValue(writer, value, valueContract, null, contract.DictionaryValueContract); } } catch (Exception ex) { if (IsErrorHandled(values.UnderlyingDictionary, contract, propertyName, ex)) HandleError(writer, initialDepth); else throw; } } writer.WriteEndObject(); _serializeStack.RemoveAt(_serializeStack.Count - 1); contract.InvokeOnSerialized(values.UnderlyingDictionary, Serializer.Context); }
private object PopulateDictionary(IWrappedDictionary dictionary, JsonReader reader, JsonDictionaryContract contract, string id) { if (id != null) Serializer.ReferenceResolver.AddReference(this, id, dictionary.UnderlyingDictionary); contract.InvokeOnDeserializing(dictionary.UnderlyingDictionary, Serializer.Context); int initialDepth = reader.Depth; do { switch (reader.TokenType) { case JsonToken.PropertyName: object keyValue = reader.Value; try { if (contract.DictionaryKeyContract == null) contract.DictionaryKeyContract = GetContractSafe(contract.DictionaryKeyType); try { keyValue = EnsureType(reader, keyValue, CultureInfo.InvariantCulture, contract.DictionaryKeyContract, contract.DictionaryKeyType); } catch (Exception ex) { throw CreateSerializationException(reader, "Could not convert string '{0}' to dictionary key type '{1}'. Create a TypeConverter to convert from the string to the key type object.".FormatWith(CultureInfo.InvariantCulture, reader.Value, contract.DictionaryKeyType), ex); } if (contract.DictionaryValueContract == null) contract.DictionaryValueContract = GetContractSafe(contract.DictionaryValueType); JsonConverter dictionaryValueConverter = GetConverter(contract.DictionaryValueContract, null); if (!ReadForType(reader, contract.DictionaryValueContract, dictionaryValueConverter != null, false)) throw CreateSerializationException(reader, "Unexpected end when deserializing object."); dictionary[keyValue] = CreateValueNonProperty(reader, contract.DictionaryValueType, contract.DictionaryValueContract, dictionaryValueConverter); } catch (Exception ex) { if (IsErrorHandled(dictionary, contract, keyValue, ex)) HandleError(reader, initialDepth); else throw; } break; case JsonToken.Comment: break; case JsonToken.EndObject: contract.InvokeOnDeserialized(dictionary.UnderlyingDictionary, Serializer.Context); return dictionary.UnderlyingDictionary; default: throw CreateSerializationException(reader, "Unexpected token when deserializing object: " + reader.TokenType); } } while (reader.Read()); throw CreateSerializationException(reader, "Unexpected end when deserializing object."); }
private object CreateAndPopulateDictionary(JsonReader reader, JsonDictionaryContract contract, string id) { object dictionary; if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor)) dictionary = contract.DefaultCreator(); else throw CreateSerializationException(reader, "Unable to find a default constructor to use for type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); IWrappedDictionary dictionaryWrapper = contract.CreateWrapper(dictionary); PopulateDictionary(dictionaryWrapper, reader, contract, id); return dictionaryWrapper.UnderlyingDictionary; }