在前一篇文章中我曾经说过,现在正在做一个小小的框架以实现采用统一的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> }