WCF 中序列化自定义依赖属性类
众所周知.NetFramework中存在着两种依赖属性,他们也分别集成着不同但名称相同的依赖对象:
System.Windows.DependencyProperty:System.Windows.DependencyObject
System.Workflow.ComponentModel.DependencyProperty:System.Workflow.ComponentModel.DependencyObject
System.Window.DependencyProperty主要用于WPF中,我们可以以注册的形式声明这种‘特别’的属性,声明中可以设置Metadata,PropertyChangeCallBack...等等,让我能用几句简单的代码来实现强大的WPF操作。
System.Workflow.ComponentModel.DependencyProperty相对于前者,是一个简化版本,只可以在声明中可以设置Metadata,但对于WorkflowFoundation这就足够用了。
两种依赖属性对各自的技术,都不同程度的提供了很好的支持,让我们在实际开发中能够更高效的书写代码,但是我们能不能像一般的属性那样随意声明,并运用?至少在WCF中我们很难使用这种特殊的属性。
以工作流中的System.workflow.ComponentModel.DependencyObject为例
如果我们想像一般自定义类那样,在声明完DataContract和DataMember后便可在基于WCF的应用程序中应用,会遇到UserData这个继承于IDictionary的讨厌属性在WCF中无法序列化。如:
[DataContract]
public class WorkFlowParameter : DependencyObject
{
public static readonly DependencyProperty IDProperty =
DependencyProperty.Register("ID", typeof(Guid), typeof(WorkFlowParameter),new PropertyMetadata("UserDefinedProperty"));
[DataMember]
public Guid ID
{
get { return (Guid)GetValue(IDProperty); }
set { SetValue(IDProperty, value); }
}
}
像这样一个看起来很平常的类,在WCF应用中,我们只能无语了。
为了使得包含依赖属性的自定义类能在WCF中正常使用
我们可以以下面的步骤自己动手写序列化方法
1.在自定义类中继承ISerializable接口,并实现构造函数以及GetObjectData方法
如:
public class WorkFlowParameter : DependencyObject,ISerializable
{
//在Deserialize时使用
public WorkFlowParameter(SerializationInfo info, StreamingContext context)
{
ID = new Guid (info.GetString("ID"));
ParameterName = info.GetString("ParameterName");
}
//在Serialize时调用,把除了UserData以外我们自定义的属性添加进来进行序列化
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
IList<DependencyProperty> properties = DependencyProperty.FromType(this.GetType());
if(properties.Count > 0)
{
foreach(DependencyProperty property in properties)
{
if(property.Name != "UserData")
{
info.AddValue(property.Name, GetValue(property));
}
}
}
}
}
2.经过我们自定义序列化后,我们可以正常使用了
如果你遇到类型XXXX不能为 ISerializable,且不能具有 DataContractAttribute 属性这时候我们需要在WCF服务中,我们可以把类中的
[DataContract]去掉
[DataContract]//去掉
public class WorkFlowParameter : DependencyObject
再试试,大功告成了。呵呵。
转载于:https://www.cnblogs.com/ystlife/archive/2009/11/15/1603568.html
WCF 中序列化自定义依赖属性类相关推荐
- WPF usercontrol 自定义依赖属性
1.依赖属性不同意一般属性,一般属性主要定义在对象中,而依赖属性是存在一个特殊的依赖属性表中. 2.当我们触发改变值时,需要通过SetValue这种方式进行触发. UserControl1.xaml: ...
- WCF中使用自定义behavior提示错误的解决方法
WCF中使用自定义behavior提示错误的解决方法 参考文章: (1)WCF中使用自定义behavior提示错误的解决方法 (2)https://www.cnblogs.com/shenba/arc ...
- Entity Framework在WCF中序列化的问题
问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 ...
- Entity Framework在WCF中序列化的问题(转)
问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 ...
- python 多线程 类_Python中如何自定义一个多线程类呢?
摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...
- 在R.java中新建自定义的新类
今天在写Android程序的时候,需要引用R.java文件中一些资源.如:R.color.color1 但是我弄了半天都不能在R.java文件中新建color的新类,原因很简单,R.java是不能被编 ...
- 项目中序列化时,去除属性为null的key
项目中对象属性中的字段有很多时,每次查询需要的属性都不同,但是还是返回null,过滤掉为空的方法 1.@JsonIgnore标签 此注解用于方法或者属性上(最好就是用在属性上),作用就是在对象做序列化 ...
- ssh中dao自定义的模板类
1.以前我们在写dao的时候总是一个类对应一个dao,其实有好多东西是重复,我们能不能设计一个模板类,然后让其他类直接初始化的时候规定号是哪一个实体对应的操作, 然后直接进行对应实体的数据库操作. 2 ...
- mapreduce中设置自定义的输入类,进行文本解析(默认以tab键为分隔符)
job.setInputFormatClass(KeyValueTextInputFormat.class);//此时map端输入的键的内容为第一个tab键以左的内容,值得内容为第一个tab键以右的内 ...
最新文章
- extjs video
- 人工神经网络研究的发展及特性,以前不叫人工智能
- 每日一皮:互联网人去银行面试...
- php绝对路径与相对路径之间关系的的深入研究
- Spring+Mybatis 多数据源配置
- mysql 5.1.53_mysql 5.1.53免安装版的优化配备和精简
- WordPress程序备受喜爱的原因:十八般武艺(3)
- SpringMVC中controller的跳转
- Mysql学习总结(26)——MySQL子查询
- vue+element+node构建单片机控制系统
- html如何让图片边缘模糊化,CSS3对图片照片进行边缘模糊处理
- Unity制作游戏自定义按键
- 软件无线电 多核服务器,软件无线电 SDR LTE平台简介
- 联想台式主机拆机教程_联想主机外壳怎么拆开_联想主机怎么拆图解
- 西安适合计算机专业的研究所,计算机类专业比较厉害的6所大学,适合于中等偏上的学生报考...
- 12306火车票查询--python
- 行人与车辆检测计数人脸识别
- 一键拼接微信好友头像/玩炫朋友圈
- 中兴程序员坠楼事件:男人四十,人生半局
- AD画PCB遇到器件之间无法连接设置
热门文章
- 基于redis分布式锁实现的多线程并发程序(原创)
- 远程桌面提示:身份验证错误 要求的函数不受支持
- #include *.c文件的妙用
- 局域网内访问mysql数据库
- 基础练习 数列特征 c语言
- windows环境下python 虚拟环境的创建和使用(virtualenvwrapper)
- centos6.4下安装python3.6以及对应的django1.11
- 博图v15.1 安装步骤
- Scrapy保存到txt文件或者数据库里面
- go protobuf tcp 粘包处理 demo