我有一些Exception
派生类型,它们为Exception
. 在网上搜索有关如何处理此类Exception
基于类型的序列化的示例和指南导致描述和代码示例相当陈旧。尝试这些样本总是会导致安全错误。为了使它工作,我必须额外用属性装饰GetObjectData
-Method 。System.Security.SecurityCritical
有趣的SecurityPermission
是,所有示例中都包含但以各种方式包含的 -Attribute 似乎不是必需的。有些示例仅将其添加到 . GetObjectData
,有些示例还将其添加到反序列化构造函数中。一些示例使用了强大的SecurityAction.Demand
-action,大多数示例使用了SecurityAction.LinkDemand
-action 和其他声明的SecurityAction.RequestMinimum
。
我的问题是,以下Exception
派生类型(对于它的序列化部分)是否适合与当今的 .net 框架(4.7.[x]+、Core[x]、Standard2.[x]+)一起使用,或者如果有什么东西不见了,或者我什至可以删除一些零件?请注意,我不想密封类型。其他Exception
类型应该能够从中派生。
[Serializable]
public class FooException : Exception{
readonly int m_fooValue;
public FooException(string message,int fooValue,Exception innerException=null) : base(message,innerException){
m_fooValue = fooValue;
}
[SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)]
protected FooException(SerializationInfo info, StreamingContext context) : base(info, context) {
m_fooValue = info.GetInt32(nameof(FooValue));
}
[SecurityCritical]
[SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)]
public override void GetObjectData(SerializationInfo info, StreamingContext context) {
if (info == null) throw new ArgumentNullException(nameof(info));
info.AddValue(nameof(FooValue), m_fooValue);
base.GetObjectData(info, context);
}
public int FooValue => m_fooValue;
}
派生类型 ( FooBarException
) 还必须SecurityCritical
在反序列化构造函数上设置 - 属性以满足LinkDemand
:
[Serializable]
public class FooBarException : FooException{
readonly int m_barValue;
public FooBarException(string message,int fooValue, int barValue, Exception innerException = null) : base(message, fooValue, innerException) {
m_barValue = barValue;
}
[SecurityCritical] // Additional for satisfying the LinkDemand on the base constructor
[SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)]
protected FooBarException(SerializationInfo info, StreamingContext context) : base(info, context) {
m_barValue = info.GetInt32(nameof(BarValue));
}
[SecurityCritical]
[SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)]
public override void GetObjectData(SerializationInfo info, StreamingContext context) {
if (info == null) throw new ArgumentNullException(nameof(info));
info.AddValue(nameof(BarValue), m_barValue);
base.GetObjectData(info, context);
}
public int BarValue => m_barValue;
}
来源
https://stackoverflow.com/a/100369/340628
https://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/