• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

一个关于解决序列化问题的编程技巧

mysql 搞代码 4年前 (2022-01-09) 16次浏览 已收录 0个评论

在前一篇文章中我曾经说过,现在正在做一个小小的框架以实现采用统一的API实现对上下文(Context)信息的统一管理。这个框架同时支持Web和GUI应用,

本文来源gaodai.ma#com搞#代!码网_

并支持跨线程传递和跨域传递(这里指在WCF服务调用中实现客户端到服务端隐式传递),以及对上下文项目(Cont

在前一篇文章中我曾经说过,现在正在做一个小小的框架以实现采用统一的API实现对上下文(Context)信息的统一管理。这个框架同时支持Web和GUI应用,并支持跨线程传递和跨域传递(这里指在WCF服务调用中实现客户端到服务端隐式传递),以及对上下文项目(ContextItem)的读写控制。关键就在于后面两个特性的支持上面,出现一个小小的关于序列化的问题。解决方案只需要改动短短的一行代码,结果却让我折腾了老半天。

一、问题重现

为了重现我实际遇到的问题,我特意将问题简化,为此我写了一个简单的例子(你可以从这里下载)。在下面的代码片断中,我创建了一个名称为ContextItem的类型,代表一个需要维护的上下文项。由于需要在WCF服务调用实现自动传递,我将起定义成DataContract。ContextItem包含Key,Value和ReadOnly三个属性,不用说ReadOnly表示该ContextItem可以被修改。注意Value属性Set方法的定义——如果ReadOnly则抛出异常。

<span>   1:</span> [DataContract(Namespace = <span>"http://www.artech.com"</span>)]
<span>   2:</span> <span>public</span> <span>class</span> ContextItem
<span>   3:</span> {
<span>   4:</span>     <span>private</span> <span>object</span> <span>value</span> = <span>null</span>;
<span>   5:</span>     [DataMember]
<span>   6:</span>     <span>public</span> <span>string</span> Key { get; <span>private</span> set; }
<span>   7:</span>     [DataMember]
<span>   8:</span>     <span>public</span> <span>object</span> Value
<span>   9:</span>     {
<span>  10:</span>         get
<span>  11:</span>         {
<span>  12:</span>             <span>return</span> <span>this</span>.<span>value</span>;
<span>  13:</span>         }
<span>  14:</span>         set
<span>  15:</span>         {
<span>  16:</span>             <span>if</span> (<span>this</span>.ReadOnly)
<span>  17:</span>             {
<span>  18:</span>                 <span>throw</span> <span>new</span> InvalidOperationException(<span>"Cannot change the value of readonly context item."</span>);
<span>  19:</span>             }
<span>  20:</span>             <span>this</span>.<span>value</span> = <span>value</span>;
<span>  21:</span>         }
<span>  22:</span>     }
<span>  23:</span>     [DataMember]
<span>  24:</span>     <span>public</span> <span>bool</span> ReadOnly { get; set; }
<span>  25:</span>     <span>public</span> ContextItem(<span>string</span> key, <span>object</span> <span>value</span>)
<span>  26:</span>     {
<span>  27:</span>         <span>if</span> (<span>string</span>.IsNullOrEmpty(key))
<span>  28:</span>         {
<span>  29:</span>             <span>throw</span> <span>new</span> ArgumentNullException(<span>"key"</span>);
<span>  30:</span>         }
<span>  31:</span>         <span>this</span>.Key = key;
<span>  32:</span>         <span>this</span>.Value = <span>value</span>;
<span>  33:</span>     }
<span>  34:</span> }


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:一个关于解决序列化问题的编程技巧
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址