如何防止反序列化期间运行一段代码?

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】:

请注意,我已经通过不同的方法完成了我的要求。

干杯

克雷格

【讨论】:

以上是关于如何防止反序列化期间运行一段代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在序列化期间隐藏字段(但不是反序列化)

Protobuf-net“反序列化期间引用跟踪对象更改引用”错误(2)

如何在 JSON 反序列化期间将引用转换为实例

如何防止反序列化破坏单例

如何防止反序列化破坏单例

如何防止反序列化破坏单例