2019-9-24-dotnet-remoting-抛出异常
| 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
2019-9-24-dotnet-remoting-抛出异常的更多相关文章
- WPF 从零开始开发 dotnet Remoting 程序
本文告诉大家如何不使用框架,从零开始开发一个 dotnet remoting 程序 在我的另一篇博客 WPF 使用RPC调用其他进程 就大概告诉了大家如何在 WPF 使用 dotnet remotin ...
- Alpha冲刺(1/10)——2019.4.24
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(1/10)--2019.4.24 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- WPF 封装 dotnet remoting 调用其他进程
原文:WPF 封装 dotnet remoting 调用其他进程 本文告诉大家一个封装好的库,使用这个库可以快速搭建多进程相互使用. 目录 创建端口 调用软件 运行的类 运行C++程序 通道 使用 在 ...
- .net remoting 抛出异常
原文:.net remoting 抛出异常 本文告诉大家如何在使用 .net remoting 的时候,抛出异常. 所有在远程软件运行的类,如果需要传输到本地,都需要继承 MarshalByRefOb ...
- Beta冲刺(3/7)——2019.5.24
所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(3/7)--2019.5.24 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...
- Alpha冲刺(2/10)——2019.4.24
作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...
- 2019.4.24(js)
1. 取得正数和负数的绝对值 Math.abs(7.25) Math.abs(-7.25) 2.利用JS刷新页面方法 https://www.cnblogs.com/Chen-XiaoJun/p/62 ...
- 2019.4.24 一题(CF 809E)——推式子+虚树
题目:http://codeforces.com/contest/809/problem/E
- Python脱产8期 Day10 2019/4/24
一 函数 1.定义:完成 特定 功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表函数>>工具. 2.函数的优点:1.避免代码的冗余:2.让程序结构代码更加清晰:3.让代码更加具 ...
- [hgoi#2019/2/24]玄学考试
感想 对于这次考试,真的不想说什么了,太玄学了!!! t1输出比标准输出长,这是什么操作???难道要关文件???但是交到oj上又A掉了.这是什么操作. t2还好,没有出什么意外...但是要吐槽一下出题 ...
随机推荐
- 基于TCP编程的socket
什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域 ...
- 【JZOJ4803】【NOIP2016提高A组模拟9.28】求导
题目描述 输入 输出 样例输入 2x^2+3x+1 样例输出 4x+3 数据范围 样例解释 求导的意思: 多项式是由若干个单项式构成的 单项式的一般形式是ax^b,其中ab都是常数,x是自变量 对于单 ...
- iOS 停止不必要的UI动效设计
http://www.cocoachina.com/design/20151124/14400.html 前言:这篇短文将会探讨UI设计中动画的过度使用,并将其与早期的视觉设计进行对比,提出一些对于有 ...
- 使用VirtualBox + Vagrant打造统一的开发环境
https://blog.csdn.net/openn/article/details/54927375 配置步骤 安装VirtualBox 虚拟系统运行在VirtualBox中,类似的工具还有VMw ...
- HDU_1021:Fibonacci Again
Problem Description There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) ...
- MySql5.7 配置文件 my.cnf 设置
https://blog.csdn.net/gzt19881123/article/details/52594783 # MySql5.7配置文件my.cnf设置 [client] port = 33 ...
- Mybatis表关联多对多
创建表 创建表对应的 JavaBean 对象 package com.tanlei.newer.model; import java.util.List; /** * @author:Mr.Tan * ...
- @codeforces - 1086F@ Forest Fires
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个无穷大的方格图,每个方格内都种了棵树. 一开始点燃了 n 棵 ...
- SVN更换新的svn链接
输入新的SVN地址即可:
- Lists and keys
function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) = ...