3
如何在不违反继承安全规则的情况下在.NET 4+中实现ISerializable?
背景:Noda Time包含许多可序列化的结构。尽管我不喜欢二进制序列化,但在1.x时间线中,我们收到了许多支持它的请求。我们通过实现ISerializable接口来支持它。 我们已经收到了有关.NET Fiddle中Noda Time 2.x 的最新问题报告。使用Noda Time 1.x的相同代码可以正常工作。抛出的异常是这样的: 重写成员时违反了继承安全性规则:“ NodaTime.Duration.System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)”。覆盖方法的安全可访问性必须与被覆盖方法的安全可访问性相匹配。 我将其范围缩小到目标框架:1.x面向.NET 3.5(客户端配置文件);2.x面向.NET 4.5。它们在支持PCL与.NET Core以及项目文件结构方面有很大的不同,但这似乎无关紧要。 我已经设法在一个本地项目中重现了它,但是还没有找到解决方案。 在VS2017中重现的步骤: 创建一个新的解决方案 创建一个针对.NET 4.5.1的新的经典Windows控制台应用程序。我称它为“ CodeRunner”。 在项目属性中,转到“签名”,然后使用新密钥对部件进行签名。取消选中密码要求,然后使用任何密钥文件名。 粘贴以下代码进行替换Program.cs。这是此Microsoft示例中的代码的简化版本。我将所有路径保持不变,因此,如果您想返回完整的代码,则无需更改其他任何内容。 码: using System; using System.Security; using System.Security.Permissions; class Sandboxer : MarshalByRefObject { static void Main() { var adSetup = new AppDomainSetup(); adSetup.ApplicationBase = System.IO.Path.GetFullPath(@"..\..\..\UntrustedCode\bin\Debug"); var permSet = …