本文告诉大家如何在使用 .net remoting 的时候,抛出异常。
所有在远程软件运行的类,如果需要传输到本地,都需要继承 MarshalByRefObject 或其他可以序列化的类。
在 .net Framework 4.0 就默认指定只反序列化基础类型,如果需要反序列化其他的类型,那么就需要设置TypeFilterLevel
,设置的方法是在使用下面代码
但是设置了TypeFilterLevel不是对所有的类型都可以进行转换,如果不小心直接在调用方法抛出异常,那么会因为无法反序列,让本地拿不到
这时本地会提示System.Runtime.Serialization.SerializationException
程序无法序列。
如果需要在 .net remoting 使用异常,那么需要自己创建一个异常,继承 RemotingException
反序列
因为默认的 RemotingException 没有反序列,所以需要添加 Serializable 特性
微软建议继承ISerializable
,标记特性
如果直接运行,会发现报告System.Runtime.Serialization.SerializationException:“未找到反序列化“lindexi.Csdn.CsdnNotFoundException”类型对象的构造函数
解决方法是创建一个构造函数,写入这个函数就不需要再写其他的代码。
如果有一些特殊的属性需要自己设置,建议创建一个默认构造函数,和两个方法,因为使用上面的方法不会序列化自己定义的属性。
在 GetObjectData 拿到必要的属性,这个需要自己把需要的属性写入。然后在构造函数重写[NotNull] SerializationInfo info, StreamingContext context
方法的,可以拿到值
因为上面的代码用到 Message ,需要重写这个属性,因为默认是只读,不能在构造函数设置。
是不是觉得很复杂,实际上简单的方法是通过 json 在GetObjectData把类转换为json,在构造转换为类。
ISerializable
那么为什么在使用 Serializable 特性还需要继承 ISerializable ,因为继承 ISerializable 就可以在一个构造函数xx([NotNull] SerializationInfo info, StreamingContext context)
进行处理和处理如何序列化。处理如何序列化可以提高性能,因为自己知道哪些需要序列化,哪些不需要。
关于 ISerializable 请看 c# - What is the point of the ISerializable interface? - Stack Overflow
How to: Create an Exception Type That Can be Thrown by Remote Objects
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=19bm8i8js1ezb
原文链接: http://blog.lindexi.com/post/dotnet-remoting-%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。