众所周知.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 中序列化自定义依赖属性类相关推荐

  1. WPF usercontrol 自定义依赖属性

    1.依赖属性不同意一般属性,一般属性主要定义在对象中,而依赖属性是存在一个特殊的依赖属性表中. 2.当我们触发改变值时,需要通过SetValue这种方式进行触发. UserControl1.xaml: ...

  2. WCF中使用自定义behavior提示错误的解决方法

    WCF中使用自定义behavior提示错误的解决方法 参考文章: (1)WCF中使用自定义behavior提示错误的解决方法 (2)https://www.cnblogs.com/shenba/arc ...

  3. Entity Framework在WCF中序列化的问题

    问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 ...

  4. Entity Framework在WCF中序列化的问题(转)

    问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 ...

  5. python 多线程 类_Python中如何自定义一个多线程类呢?

    摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...

  6. 在R.java中新建自定义的新类

    今天在写Android程序的时候,需要引用R.java文件中一些资源.如:R.color.color1 但是我弄了半天都不能在R.java文件中新建color的新类,原因很简单,R.java是不能被编 ...

  7. 项目中序列化时,去除属性为null的key

    项目中对象属性中的字段有很多时,每次查询需要的属性都不同,但是还是返回null,过滤掉为空的方法 1.@JsonIgnore标签 此注解用于方法或者属性上(最好就是用在属性上),作用就是在对象做序列化 ...

  8. ssh中dao自定义的模板类

    1.以前我们在写dao的时候总是一个类对应一个dao,其实有好多东西是重复,我们能不能设计一个模板类,然后让其他类直接初始化的时候规定号是哪一个实体对应的操作, 然后直接进行对应实体的数据库操作. 2 ...

  9. mapreduce中设置自定义的输入类,进行文本解析(默认以tab键为分隔符)

    job.setInputFormatClass(KeyValueTextInputFormat.class);//此时map端输入的键的内容为第一个tab键以左的内容,值得内容为第一个tab键以右的内 ...

最新文章

  1. extjs video
  2. 人工神经网络研究的发展及特性,以前不叫人工智能
  3. 每日一皮:互联网人去银行面试...
  4. php绝对路径与相对路径之间关系的的深入研究
  5. Spring+Mybatis 多数据源配置
  6. mysql 5.1.53_mysql 5.1.53免安装版的优化配备和精简
  7. WordPress程序备受喜爱的原因:十八般武艺(3)
  8. SpringMVC中controller的跳转
  9. Mysql学习总结(26)——MySQL子查询
  10. vue+element+node构建单片机控制系统
  11. html如何让图片边缘模糊化,CSS3对图片照片进行边缘模糊处理
  12. Unity制作游戏自定义按键
  13. 软件无线电 多核服务器,软件无线电 SDR LTE平台简介
  14. 联想台式主机拆机教程_联想主机外壳怎么拆开_联想主机怎么拆图解
  15. 西安适合计算机专业的研究所,计算机类专业比较厉害的6所大学,适合于中等偏上的学生报考...
  16. 12306火车票查询--python
  17. 行人与车辆检测计数人脸识别
  18. 一键拼接微信好友头像/玩炫朋友圈
  19. 中兴程序员坠楼事件:男人四十,人生半局
  20. AD画PCB遇到器件之间无法连接设置

热门文章

  1. 基于redis分布式锁实现的多线程并发程序(原创)
  2. 远程桌面提示:身份验证错误 要求的函数不受支持
  3. #include *.c文件的妙用
  4. 局域网内访问mysql数据库
  5. 基础练习 数列特征 c语言
  6. windows环境下python 虚拟环境的创建和使用(virtualenvwrapper)
  7. centos6.4下安装python3.6以及对应的django1.11
  8. 博图v15.1 安装步骤
  9. Scrapy保存到txt文件或者数据库里面
  10. go protobuf tcp 粘包处理 demo