y] = result = newDescription; } } } return result; } internal MessageDescription Get(IMessage message); internal MessageDictionary GetAccessor(IMessage message); internal MessageDictionary GetAccessor(IMessage message, bool getOriginalValues) }
可以看到,类内部有个字典,所有新建的MessageDescription对象实例都会被加入其中.而每次从中获取描述时,如果当前不存在,就会新建一个并返回.
为了能够在元数据层面操作对象,作者引入了MessageDictionary类
internalclass MessageDictionary : IDictionary
可以看到,每一个MessageDictionary类实例都与一个IMessage对象实例和一个MessageDescription对象实例关联,在构造函数中传入.对MessageDictionary的操作就是对IMessage的操作.
比如上面所举的Add方法,首先去MessageDescription处获取名为key的MessagePart对象.如果获取不到,说明要么IMessage对象没有此属性或字段,要么没有标记MessagePartAttribute特性导致没有对应的MessagePart描述对象.于是将其存于ExtraData属性中.此属性是IDictionary
最后,使用MessageSerializer类将MessageDictionary类实例序列化成IDictionary
internalclass MessageSerializer { privatereadonly Type messageType; private MessageSerializer(Type messageType) { this.messageType = messageType; } internalstatic MessageSerializer Get(Type messageType) { returnnew MessageSerializer(messageType); } internal IDictionary
对于序列化,直接遍历MessageDictionary类,将必填成员,非默认值成员和非MessageDescription类描述的成员都取出来,组装成Dictionary
protectedoverridebyte[] SerializeCore(T message) { var fields = MessageSerializer.Get(message.GetType()).Serialize(MessageDescriptions.GetAccessor(message)); string value = MessagingUtilities.CreateQueryString(fields); return Encoding.UTF8.GetBytes(value); }
第一行,将信息通过上面所述的方式序列化成IDictionary
internalstaticstring CreateQueryString(IEnumerable
可以看到,很简单,就是遍历字值对拼接字符串,,最后使用Utf8进行二进制编码后返回. DeserializeCore方法如下
protectedoverridevoid DeserializeCore(T message, byte[] data) { string value = Encoding.UTF8.GetString(data); // Deserialize into message newly created instance.var serializer = MessageSerializer.Get
(message.GetType()); var fields = MessageDescriptions.GetAccessor(message); serializer.Deserialize(HttpUtility.ParseQueryString(value).ToDictionary(), fields); }
首先将二进制流转换成Utf8编码的字符串,然后将此串转换成QueryString字符串,然后再次转换成IDictionary
3.资源服务端
在.Net中,有两个类别的体系来保证安全,通过代码访问安全,使代码可以根据它所来自的位置以及代码标识的其他方面,获得不同等级的受信度,减小恶意代码或包含错误的代码执行的可能性,来保证二进制层面的执行安全.比如在沙箱中运行的程序,就是部分信任程序,比如无法操作本地硬盘文件.通过基于角色的安全,使代码判定当前用户是谁以及拥有的角色,获取不同的权限,来保证业务安全.DotNetOpenAuth框架使用的是后者. 参考:
.NET(C#):不同级别的安全透明代码对类型的影响 .NET中非对称加密RSA算法的密钥保存
相关推荐: