title author date CreateTime categories
dotnet remoting 抛出异常
lindexi
2019-09-24 15:39:50 +0800
2018-04-02 11:27:43 +0800
.net remoting rpc WPF

本文告诉大家如何在使用 .net remoting 的时候,抛出异常。

所有在远程软件运行的类,如果需要传输到本地,都需要继承 MarshalByRefObject 或其他可以序列化的类。

在 .net Framework 4.0 就默认指定只反序列化基础类型,如果需要反序列化其他的类型,那么就需要设置TypeFilterLevel,设置的方法是在使用下面代码

      public static IChannel CreatChannel(string port = "")
{
if (string.IsNullOrEmpty(port))
{
port = Guid.NewGuid().ToString("N");
} var serverProvider = new SoapServerFormatterSinkProvider();
var clientProvider = new SoapClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["portName"] = port.ToString(); return new IpcChannel(props, clientProvider, serverProvider);
}

但是设置了TypeFilterLevel不是对所有的类型都可以进行转换,如果不小心直接在调用方法抛出异常,那么会因为无法反序列,让本地拿不到

 // 远程

 public void Foo()
{
throw new CsdnNotFoundException();
} public class CsdnNotFoundException : Exception
{
public CsdnNotFoundException(string str) :
base(str)
{ }
}

这时本地会提示System.Runtime.Serialization.SerializationException程序无法序列。

如果需要在 .net remoting 使用异常,那么需要自己创建一个异常,继承 RemotingException

反序列

因为默认的 RemotingException 没有反序列,所以需要添加 Serializable 特性

 [Serializable]
public class CsdnNotFoundException : RemotingException
{
public CsdnNotFoundException(string str) :
base(str)
{ }
}

微软建议继承ISerializable,标记特性

 [Serializable]
public class CsdnNotFoundException : RemotingException, ISerializable
{
public CsdnNotFoundException(string str) :
base(str)
{ }
}

如果直接运行,会发现报告System.Runtime.Serialization.SerializationException:“未找到反序列化“lindexi.Csdn.CsdnNotFoundException”类型对象的构造函数

解决方法是创建一个构造函数,写入这个函数就不需要再写其他的代码。

        protected CsdnNotFoundException([NotNull] SerializationInfo info, StreamingContext context) : base(info,
context)
{
}

如果有一些特殊的属性需要自己设置,建议创建一个默认构造函数,和两个方法,因为使用上面的方法不会序列化自己定义的属性。

 [Serializable]
public class CsdnNotFoundException : RemotingException, ISerializable
{
public CsdnNotFoundException()
{
//默认构造,可以在反射创建
} public CsdnNotFoundException(string str) :
base(str)
{ } protected CsdnNotFoundException([NotNull] SerializationInfo info, StreamingContext context)
//: base(info, context) 不使用基类的原因是基类会报告 找不到 ClassName 和其他很多的坑
{
//反序列化创建 Message = (string) info.GetValue(MessageSerialization, typeof(string));
} // 重写消息,用于在构造设置值
public override string Message { get; } // 用于在构造拿到消息的值
private const string MessageSerialization = "Message"; // 重写这个方法,在序列化调用
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(MessageSerialization, Message);
}
}

在 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

最新文章

  1. 9.2.1 .net framework下的MVC 控件的封装(上)
  2. VS2015编译boost1.62
  3. linux打包与压缩
  4. 虚拟机centos6.5 --ssh免密码登录
  5. JavaWeb---总结(八)HttpServletResponse对象(二)
  6. service对象
  7. android 搭建环境工具
  8. hdu------2488Tornado(几何)
  9. SELECTION-SCREEN 加按钮
  10. [视频]MAC OS 技巧之如何更新及重装MAC系统
  11. Java Map各遍历方式的性能比较
  12. [iOS基础控件 - 6.2] LOL英雄列表 UITableView单项显示
  13. 方便mac os 10.9系统中phpstorm配置php运行环境
  14. 从相对路径说开来(从C++到Qt)
  15. ASP.NET图片验证码学习!
  16. 5、Java Swing布局管理器(FlowLayout、BorderLayout、CardLayout、BoxLayout、GirdBagLayout 和 GirdLayout)
  17. React Native入门 认识Flexbox布局
  18. Docker 启动,进入容器,查看log命令
  19. Dijkstra算法——计算一个点到其他所有点的最短路径的算法
  20. 几个java小例子

热门文章

  1. quarts之Cron表达式示例
  2. ajax请求 400 Bad Request, 然后就没进后台方法!
  3. 关于 SSD 的接口和相关名词(2019-09-10)
  4. 使用cmd发送邮件
  5. 在一台机器上搭建多个redis实例
  6. shell学习(15)- eval及shell No such file or directory解决办法
  7. LeetCode115 Distinct Subsequences
  8. Java“封装”的例子
  9. python 字典元素删减
  10. python的if循环和嵌套