Невозможно отлить объект типа " Newtonsoft.формат JSON.В LINQ.Создание экземпляра системы' в тип '.Во время выполнения.Сериализация.ISafeSerializationData'

Я получаю следующее исключение, пытаясь десериализовать вызов веб-api - сообщение неясно, поэтому я не могу понять, что происходит - этот бросок работает в других случаях, не уверен, что здесь не так:

исключения:

  InnerException: System.Reflection.TargetInvocationException
   _HResult=-2146232828
   _message=Exception has been thrown by the target of an invocation.
   HResult=-2146232828
   IsTransient=false
   Message=Exception has been thrown by the target of an invocation.
   Source=mscorlib
   StackTrace:
        at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
        at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
        at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
        at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
        at Newtonsoft.Json.Serialization.JsonContract.<>c__DisplayClass1.<CreateSerializationCallback>b__0(Object o, StreamingContext context)
        at Newtonsoft.Json.Serialization.JsonContract.InvokeOnDeserialized(Object o, StreamingContext context)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.OnDeserialized(JsonReader reader, JsonContract contract, Object value)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateISerializable(JsonReader reader, JsonISerializableContract contract, JsonProperty member, String id)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
        at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
        at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
        at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.ReadFromStream(Type type, Stream readStream, Encoding effectiveEncoding, IFormatterLogger formatterLogger)
        at System.Net.Http.Formatting.JsonMediaTypeFormatter.ReadFromStream(Type type, Stream readStream, Encoding effectiveEncoding, IFormatterLogger formatterLogger)
        at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
        at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
     --- End of stack trace from previous location where exception was thrown ---
        at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
        at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
        at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
        at System.Net.Http.HttpContentExtensions.<ReadAsAsyncCore>d__0`1.MoveNext()
   InnerException: System.InvalidCastException
        _HResult=-2147467262
        _message=Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'System.Runtime.Serialization.ISafeSerializationData'.
        HResult=-2147467262
        IsTransient=false
        Message=Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'System.Runtime.Serialization.ISafeSerializationData'.
        Source=mscorlib
        StackTrace:
             at System.Runtime.Serialization.SafeSerializationManager.CompleteDeserialization(Object deserializedObject)
             at System.Exception.OnDeserialized(StreamingContext context)
        InnerException: 

мой код:

public SensoriaApiResult<T> PostSensoriaApiResult(object body)
    {
        HttpClient client = SetupClient();

        HttpResponseMessage response;
        response = client.PostAsJsonAsync(url, body).Result;

        SensoriaApiResult<T> result = response.Content.ReadAsAsync<SensoriaApiResult<T>>().Result;
        return result;
    }

Json вернулся:

{"StatusCode":500,"APIResult":null,"HttpError":{"Message":"Sensoria API internal error","SensoriaApiErrorCode":983041},"Exception":{"ClassName":"System.Data.Entity.Infrastructure.DbUpdateException","Message":"An error occurred while updating the entries. See the inner exception for details.","Data":{},"InnerException":{"ClassName":"System.Data.Entity.Core.UpdateException","Message":"An error occurred while updating the entries. See the inner exception for details.","Data":{},"InnerException":{"Errors":[{"source":".Net SqlClient Data Provider","number":547,"state":0,"errorClass":16,"server":".","message":"The INSERT statement conflicted with the FOREIGN KEY constraint "FK_UserBase.ClosetItems_Catalog.Products". The conflict occurred in database "Sensoria.Knowledge.Database", table "dbo.Catalog.Products", column 'ProductId'.","procedure":"","lineNumber":1,"win32ErrorCode":0},{"source":".Net SqlClient Data Provider","number":3621,"state":0,"errorClass":0,"server":".","message":"The statement has been terminated.","procedure":"","lineNumber":1,"win32ErrorCode":0}],"ClientConnectionId":"7b976c29-59ff-491c-a3aa-01750e17cb36","ClassName":"System.Data.SqlClient.SqlException","Message":"The INSERT statement conflicted with the FOREIGN KEY constraint "FK_UserBase.ClosetItems_Catalog.Products". The conflict occurred in database "Sensoria.Knowledge.Database", table "dbo.Catalog.Products", column 'ProductId'.rnThe statement has been terminated.","Data":{"HelpLink.ProdName":"Microsoft SQL Server","HelpLink.ProdVer":"11.00.3128","HelpLink.EvtSrc":"MSSQLServer","HelpLink.EvtID":"547","HelpLink.BaseHelpUrl":"http://go.microsoft.com/fwlink","HelpLink.LinkId":"20476"},"InnerException":null,"HelpURL":null,"StackTraceString":"   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)rn   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)rn   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)rn   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()rn   at System.Data.SqlClient.SqlDataReader.get_MetaData()rn   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)rn   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)rn   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)rn   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)rn   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)rn   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)rn   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<>c__DisplayClassb.<Reader>b__8()rn   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TInterceptionContext,TResult](Func`1 operation, TInterceptionContext interceptionContext, Action`1 executing, Action`1 executed)rn   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)rn   at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior)rn   at System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary`2 identifierValues, List`1 generatedValues)rn   at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()","RemoteStackTraceString":null,"RemoteStackIndex":0,"ExceptionMethod":"8nOnErrornSystem.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089nSystem.Data.SqlClient.SqlConnectionnVoid OnError(System.Data.SqlClient.SqlException, Boolean, System.Action`1[System.Action])","HResult":-2146232060,"Source":".Net SqlClient Data Provider","WatsonBuckets":null},"HelpURL":null,"StackTraceString":"   at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()rn   at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.<Update>b__2(UpdateTranslator ut)rn   at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult, Func`2 updateFunction, Boolean throwOnClosedConnection)rn   at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update(Boolean throwOnClosedConnection)rn   at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__33()rn   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)rn   at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy)rn   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass28.<SaveChanges>b__25()rn   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)rn   at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)rn   at System.Data.Entity.Internal.InternalContext.SaveChanges()","RemoteStackTraceString":null,"RemoteStackIndex":0,"ExceptionMethod":"8nUpdatenEntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089nSystem.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslatornInt32 Update()","HResult":-2146233087,"Source":"EntityFramework","WatsonBuckets":null},"HelpURL":null,"StackTraceString":"   at Sensoria.Models.ShoeClosetModel.CreateClosetModelForUser(Int32 userId, ShoeClosetItem newClosetItem) in c:UsersmaurgiSourceHgsensoria-mainSourceWebSensoria.ModelsShoeClosetModel.cs:line 225rn   at Sensoria.Models.ShoeClosetModel.CreateClosetItem(Int32 userID, ShoeClosetItem newClosetItem) in c:UsersmaurgiSourceHgsensoria-mainSourceWebSensoria.ModelsShoeClosetModel.cs:line 76rn   at Sensoria.Api.Controllers.ShoeClosetController.AddNewShoe(Int32 userId, ShoeClosetItem sItem) in c:UsersmaurgiSourceHgsensoria-mainSourceWebSensoria.ApiControllersShoeClosetController.cs:line 79","RemoteStackTraceString":null,"RemoteStackIndex":0,"ExceptionMethod":"8nCreateClosetModelForUsernSensoria.Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullnSensoria.Models.ShoeClosetModelnSensoria.Models.ShoeClosetModel CreateClosetModelForUser(Int32, Sensoria.Api.Core.Models.ShoeClosetItem)","HResult":-2146233087,"Source":"Sensoria.Models","WatsonBuckets":null,"SafeSerializationManager":{"m_serializedStates":[{"<InvolvesIndependentAssociations>k__BackingField":false}]},"CLR_SafeSerializationManager_RealType":"System.Data.Entity.Infrastructure.DbUpdateException, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},"ModelState":null}

определение универсального класса APIResult:

public class SensoriaApiResult<T>
{
    /// <summary>
    /// The 
    /// </summary>
    [DataMember]
    public HttpStatusCode StatusCode;
    [DataMember]
    public T APIResult;
    [DataMember]
    public HttpError HttpError;
    [DataMember]
    public Exception Exception;
    [DataMember]
    public ModelStateDictionary ModelState;

    ...

}

4 ответов


поскольку этому вопросу почти 2 года, я сильно сомневаюсь, что могу помочь исходному плакату, но для любого, кто ищет эту ошибку, это вызвано тем, что многие исключения Entity data framework не реализуют конструктор сериализации, а вместо этого полагаются на SerializeObjectState событие (как и система.Сеть.Http.HttpRequestException, который, оказывается, маленький жук, который дает меня подходит для последних нескольких часов). JSON.NET неправильно обрабатывает эту ситуацию, как описано в этой отчет об ошибках.


относительно сериализации / десериализации HttpRequestException этот ужасный Хак Исправлена проблема для меня:

string myJson = JsonConvert.SerializeObject(myObject).Replace("\"SafeSerializationManager\":", "\"_SafeSerializationManager\":");

у меня была эта проблема, когда я пытался десриализовать исключение (которое я сериализовал) с внутренним исключением типа HttpRequestException. Это исключение не может быть десеализовано, так как оно не имеет реализации GetObjectData.

моим решением было удаление HttpRequestException экземпляров перед сериализацией.


если вы наблюдаете возвращенный json, представляющий сериализованное исключение, интересная часть здесь:

... "InnerException": {"ошибки": [{"источник":"поставщик данных .Net SqlClient","номер": 547,"состояние": 0,"класс ошибок": 16,"сервер":".", "message": "оператор INSERT конфликтовал с ограничением внешнего ключа \" FK_UserBase.ClosetItems_Catalog.Средства."\ Конфликт произошел в базе данных \ " Sensoria.Знание.База данных\", таблица \ " dbo.Каталог.Продукты\", колонка "ProductId".процедура":"", "номер строки": 1,"win32ErrorCode": 0}, {"Источник":"поставщик данных .Net SqlClient","номер": 3621,"состояние": 0,"класс ошибок": 0,"сервер":".", "сообщение": "заявление было прекращено.","procedure":"","lineNumber":1,"win32ErrorCode":0}],"ClientConnectionId":"7b976c29-59ff-491c-a3aa-01750e17cb36","ClassName":"System.Данные.В sqlclient.SqlException", "Message":"оператор INSERT конфликтовал с ограничением внешнего ключа \" FK_UserBase.ClosetItems_Catalog.Средства."\ Этот конфликт произошел в базе данных \ " Sensoria.Знание.База данных\", таблица \ " dbo.Каталог.Products\", колонка 'ProductId'.\ R \ n оператор был завершен.", "Data": {"HelpLink.ProdName": "Microsoft SQL ...

а именно это утверждение:

" The инструкция INSERT конфликтует с ограничением внешнего ключа \"FK_UserBase.ClosetItems_Catalog.Средства."\ Конфликт произошел в базе данных \ " Sensoria.Знание.Таблица базы данных \"dbo.Каталог.Продукты\", колонки 'ProductId'**

поэтому я бы предложил наблюдать значение param body, получения и передачи: PostSensoriaApiResult(object body). Там могут быть некоторые ProductId не существует (очень часто 0, т. е. значение по умолчанию любого int собственность)