如何防止反序列化期间运行一段代码?
Posted
技术标签:
【中文标题】如何防止反序列化期间运行一段代码?【英文标题】:How can I prevent a piece of code running during deserialization? 【发布时间】:2013-04-13 03:07:20 【问题描述】:我有以下代码利用 PostSharp 在设置导航属性(使用 ForeignKeyAttribute 标记)时自动设置属性(外键)。
反序列化大量实体时代码非常慢,所以我想知道是否有任何方法可以阻止代码在反序列化期间运行。
代码中仍有一些漏洞,我仍在处理它,但我首先在断开连接的环境中使用实体框架代码,并且没有 dbcontext 来为我处理。
[Serializable]
public class ForeignKeySynchronisationAttribute : LocationInterceptionAspect
public override void OnSetValue(LocationInterceptionArgs args)
try
var foreignKeyIdSet = false;
var entity = args.Instance;
var propertyInfo = args.Location.PropertyInfo;
if (typeof(BaseEntity).IsAssignableFrom(propertyInfo.PropertyType))
// First look for metadata defined ForeignKeyAttribute
var metadata =
entity.GetType()
.GetCustomAttributes(typeof(MetadataTypeAttribute), true)
.OfType<MetadataTypeAttribute>()
.FirstOrDefault();
if (metadata != null)
var metadataProperty = metadata.MetadataClassType.GetProperty(propertyInfo.PropertyType.Name);
if (metadataProperty != null)
var foreignKeyAttribute = metadataProperty.GetCustomAttributes<ForeignKeyAttribute>().First();
if (foreignKeyAttribute != null)
var foreignKeyIdPropertyInfo = entity.GetType().GetProperty(foreignKeyAttribute.Name);
foreignKeyIdPropertyInfo.SetValue(entity, ((BaseEntity)args.Value).PrimaryKey);
foreignKeyIdSet = true;
// Then look for normally defined ForeignKeyAttribute
if (!foreignKeyIdSet)
var foreignKeyAttribute = propertyInfo.GetCustomAttributes<ForeignKeyAttribute>().First();
if (foreignKeyAttribute != null)
var foreignKeyIdPropertyInfo = entity.GetType().GetProperty(foreignKeyAttribute.Name);
foreignKeyIdPropertyInfo.SetValue(entity, ((BaseEntity)args.Value).PrimaryKey);
catch (Exception)
throw;
finally
base.OnSetValue(args);
【问题讨论】:
【参考方案1】:请注意,我已经通过不同的方法完成了我的要求。
干杯
克雷格
【讨论】:
以上是关于如何防止反序列化期间运行一段代码?的主要内容,如果未能解决你的问题,请参考以下文章