我目前正在将.net业务对象库转换为PCL文件,以便它可以与Xamarin IOS / Android一起使用,虽然它主要包含POCO对象,但它也包含自定义异常,但这会引发错误。
采取典型的自定义例外:
[Serializable]
public class EncryptKeyNotFoundException : Exception
{
public EncryptKeyNotFoundException()
: base() { }
public EncryptKeyNotFoundException(string message)
: base(message) { }
public EncryptKeyNotFoundException(string format, params object[] args)
: base(string.Format(format, args)) { }
public EncryptKeyNotFoundException(string message, Exception innerException)
: base(message, innerException) { }
public EncryptKeyNotFoundException(string format, Exception innerException, params object[] args)
: base(string.Format(format, args), innerException) { }
protected EncryptKeyNotFoundException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
}
正如预期的那样,PCL不喜欢[Serializable]
和SerializationInfo
。虽然我可能会坚持使用[DataContract]而不是使用[Serialiable]
,但仍然无法使用SerializationInfo
来解决问题。
有没有办法解决这个问题?
感谢。
更新
我按照建议查看了Implementing custom exceptions in a Portable Class Library,但未识别以下2个属性:
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
我必须缺少一个参考但是哪个汇编?
我目前正在寻找Portable class library: recommended replacement for [Serializable]
中提供的替代解决方案希望这会奏效。一旦我有更多信息要提供,我会更新我的答案。
更新
ClassInterfaceAttribute
是System.RunTime.InteroServices的一部分,但是我无法将其添加到我的PCL项目中,至少它是不可见的。我错过了什么吗?
另一篇文章提供了额外的信息,它看起来在使用条件编译时,这应该可行,但同样,当json库中的示例代码似乎工作时,我必须遗漏一些东西,因为我无法添加引用所以[Serializable]
不会引发错误,但我似乎无法做到这一点。
我尝试过的一件事就是简单地说出来:
protected EncryptKeyNotFoundException(SerializationInfo info,
StreamingContext context) : base(info, context) { }
我可以编译我的pcl项目,所以问题是我需要这个吗?
感谢。
答案 0 :(得分:1)
我认为您在建议的链接中误解了答案。您不需要在自定义异常实施中添加ClassInterfaceAttribute
或ComVisibleAttribute
。如果我们查看Exception class for .NET Framework,我们会看到:
[SerializableAttribute]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class Exception : ISerializable, _Exception
和Exception class for Silverlight,
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class Exception
SerializableAttribute
不可用。
另一个不同之处是Silverlight的Exception类只有3个构造函数。
构造函数Exception(SerializationInfo, StreamingContext)
不可用。我们还可以在下面的PCL库中看到自定义异常实现的屏幕截图,其中只有3个构造函数可用于Exception。
您没有尝试创建此类构造函数:
EncryptKeyNotFoundException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
因此,在使用DataContract而不是Serializable的PCL自定义异常实现中,将是这样的:
[DataContract]
public class EncryptKeyNotFoundException : System.Exception
{
public EncryptKeyNotFoundException() : base() { }
public EncryptKeyNotFoundException(string message) : base(message) { }
public EncryptKeyNotFoundException(string message, Exception innerException) : base(message, innerException) { }
}