/// <summary>
        /// Creates a <see cref="JsonISerializableContract"/> for the given type.
        /// </summary>
        /// <param name="objectType">Type of the object.</param>
        /// <returns>A <see cref="JsonISerializableContract"/> for the given type.</returns>
        protected virtual JsonISerializableContract CreateISerializableContract(Type objectType)
        {
            JsonISerializableContract contract = new JsonISerializableContract(objectType);

            InitializeContract(contract);

            ConstructorInfo constructorInfo = contract.NonNullableUnderlyingType.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(SerializationInfo), typeof(StreamingContext) }, null);

            if (constructorInfo != null)
            {
                MethodCall <object, object> methodCall = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall <object>(constructorInfo);

                contract.ISerializableCreator = (args => methodCall(null, args));
            }

            return(contract);
        }
    private void SerializeISerializable(JsonWriter writer, ISerializable value, JsonISerializableContract contract, JsonProperty member, JsonContract collectionValueContract)
    {
      contract.InvokeOnSerializing(value, Serializer.Context);
      _serializeStack.Add(value);

      writer.WriteStartObject();

      if (ShouldWriteType(TypeNameHandling.Objects, contract, member, collectionValueContract))
      {
          WriteTypeProperty(writer, contract.UnderlyingType);
      }

      SerializationInfo serializationInfo = new SerializationInfo(contract.UnderlyingType, new FormatterConverter());
      value.GetObjectData(serializationInfo, Serializer.Context);

      foreach (SerializationEntry serializationEntry in serializationInfo)
      {
        writer.WritePropertyName(serializationEntry.Name);
        SerializeValue(writer, serializationEntry.Value, GetContractSafe(serializationEntry.Value), null, null);
      }

      writer.WriteEndObject();

      _serializeStack.RemoveAt(_serializeStack.Count - 1);
      contract.InvokeOnSerialized(value, Serializer.Context);
    }
 private void GenerateISerializableContract(Type type, JsonISerializableContract contract)
 {
     CurrentSchema.AllowAdditionalProperties = true;
 }
        private object CreateISerializable(JsonReader reader, JsonISerializableContract contract, string id)
        {
            Type objectType = contract.UnderlyingType;

              SerializationInfo serializationInfo = new SerializationInfo(contract.UnderlyingType, GetFormatterConverter());

              bool exit = false;
              do
              {
            switch (reader.TokenType)
            {
              case JsonToken.PropertyName:
            string memberName = reader.Value.ToString();
            if (!reader.Read())
              throw CreateSerializationException(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName));

            serializationInfo.AddValue(memberName, JToken.ReadFrom(reader));
            break;
              case JsonToken.Comment:
            break;
              case JsonToken.EndObject:
            exit = true;
            break;
              default:
            throw CreateSerializationException(reader, "Unexpected token when deserializing object: " + reader.TokenType);
            }
              } while (!exit && reader.Read());

              if (contract.ISerializableCreator == null)
            throw CreateSerializationException(reader, "ISerializable type '{0}' does not have a valid constructor. To correctly implement ISerializable a constructor that takes SerializationInfo and StreamingContext parameters should be present.".FormatWith(CultureInfo.InvariantCulture, objectType));

              object createdObject = contract.ISerializableCreator(serializationInfo, Serializer.Context);

              if (id != null)
            Serializer.ReferenceResolver.AddReference(this, id, createdObject);

              // these are together because OnDeserializing takes an object but for an ISerializable the object is full created in the constructor
              contract.InvokeOnDeserializing(createdObject, Serializer.Context);
              contract.InvokeOnDeserialized(createdObject, Serializer.Context);

              return createdObject;
        }