尝试序列化一组错误时出现此错误:
“ISerialized 类型‘System.Data.Entity.Infrastruct.DbUpdateConcurrencyException’没有有效的构造函数。要正确实现 ISerialized,应存在采用 SerializationInfo 和 StreamingContext 参数的构造函数。”
构造函数实际上存在于基类中,但它是一个protected
member.
有人要求查看 JSON:
{
"$type": "System.Data.Entity.Infrastructure.DbUpdateConcurrencyException, EntityFramework",
"ClassName": "System.Data.Entity.Infrastructure.DbUpdateConcurrencyException",
"Message": "Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions.",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": {
"$type": "System.Data.Entity.Core.OptimisticConcurrencyException, EntityFramework",
"ClassName": "System.Data.Entity.Core.OptimisticConcurrencyException",
"Message": "Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions.",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpURL": null,
"StackTraceString": " at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.ValidateRowsAffected(Int64 rowsAffected, UpdateCommand source)\r\n at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()\r\n at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.<Update>b__2(UpdateTranslator ut)\r\n at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult, Func`2 updateFunction)\r\n at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update()\r\n at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__35()\r\n at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)\r\n at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)\r\n at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass2a.<SaveChangesInternal>b__27()\r\n at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)\r\n at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)\r\n at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)\r\n at System.Data.Entity.Internal.InternalContext.SaveChanges()",
"RemoteStackTraceString": null,
"RemoteStackIndex": 0,
"ExceptionMethod": "8\nValidateRowsAffected\nEntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator\nVoid ValidateRowsAffected(Int64, System.Data.Entity.Core.Mapping.Update.Internal.UpdateCommand)",
"HResult": -2146233087,
"Source": "EntityFramework",
"WatsonBuckets": null
},
"HelpURL": null,
"StackTraceString": " at System.Data.Entity.Internal.InternalContext.SaveChanges()\r\n at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()\r\n at System.Data.Entity.DbContext.SaveChanges()\r\n at REDACTED FOR DISPLAY ON STACKOVERFLOW",
"RemoteStackTraceString": null,
"RemoteStackIndex": 0,
"ExceptionMethod": "8\nSaveChanges\nEntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Data.Entity.Internal.InternalContext\nInt32 SaveChanges()",
"HResult": -2146233087,
"Source": "EntityFramework",
"WatsonBuckets": null,
"SafeSerializationManager": {
"$type": "System.Runtime.Serialization.SafeSerializationManager, mscorlib",
"m_serializedStates": {
"$type": "System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib",
"$values": [
{
"$type": "System.Data.Entity.Infrastructure.DbUpdateException+DbUpdateExceptionState, EntityFramework",
"InvolvesIndependentAssociations": false
}
]
}
},
"CLR_SafeSerializationManager_RealType": "System.Data.Entity.Infrastructure.DbUpdateConcurrencyException, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
}
下面是抛出异常的示例代码:
var serializationSettings = new JsonSerializerSettings() {
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateParseHandling = DateParseHandling.DateTime,
DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind,
DefaultValueHandling = DefaultValueHandling.Include,
TypeNameHandling = TypeNameHandling.All,
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple,
ObjectCreationHandling = ObjectCreationHandling.Replace, //Necessary for subclassing list types
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
};
var json = JsonConvert.SerializeObject( new System.Data.Entity.Infrastructure.DbUpdateConcurrencyException( "hi" ), serializationSettings );
if (json == null)
return null;
var err = JsonConvert.DeserializeObject<System.Data.Entity.Infrastructure.DbUpdateConcurrencyException>( json, serializationSettings ); //throws error
这变得更加奇怪,因为正如一个答案指出的那样,这是一个特殊的类,因为它不直接实现具有预期签名的构造函数。相反,反编译该类显示了某种不实现预期构造函数的、非常字面的“理由”......
/// <summary>
/// Exception thrown by <see cref="T:System.Data.Entity.DbContext" /> when the saving of changes to the database fails.
/// Note that state entries referenced by this exception are not serialized due to security and accesses to the
/// state entries after serialization will return null.
/// </summary>
[SuppressMessage("Microsoft.Design", "CA1032:ImplementStandardExceptionConstructors",
Justification = "SerializeObjectState used instead")]
[Serializable]
public class DbUpdateException : DataException
{
/// <summary>
/// Holds exception state that will be serialized when the exception is serialized.
/// </summary>
[Serializable]
private struct DbUpdateExceptionState : ISafeSerializationData
{