Невозможно отлить объект типа " 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
собственность)