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 new JsonSerializationException("Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName));

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

              if (contract.ISerializableCreator == null)
            throw new JsonSerializationException("ISerializable type '{0}' does not have a valid constructor.".FormatWith(CultureInfo.InvariantCulture, objectType));

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

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

              contract.InvokeOnDeserializing(createdObject, Serializer.Context);
              contract.InvokeOnDeserialized(createdObject, Serializer.Context);

              return createdObject;
        }
Exemplo n.º 2
0
 private void GenerateISerializableContract(Type type, JsonISerializableContract contract)
 {
     CurrentSchema.AllowAdditionalProperties = true;
 }
        private void SerializeISerializable(JsonWriter writer, ISerializable value, JsonISerializableContract contract)
        {
            contract.InvokeOnSerializing(value, Serializer.Context);
              SerializeStack.Add(value);

              writer.WriteStartObject();

              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);
        }