using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.ObjectModel;
namespace MarvellousWorks
{
    
/// <summary>
    
/// 安全信息上下文
    
/// </summary>
    
/// <remarks>
    
///     为了同时满足Binary调用和Soap调用的需要,完全定制化了二进制序列化和SOAP序列化的过程
    
/// </remarks>

    [XmlRoot("securityContext")]
    [Serializable]
    
public class SecurityContext : IXmlSerializable, ISerializable
    
{
        
Protected Consts

        
Protected Fields

        
Constructors


        
/// <summary>
        
/// 访问Context内容项
        
/// </summary>
        
/// <param name="key"></param>
        
/// <returns></returns>
        
/// <remarks>设计上,这个类型不会随便抛出异常,除非提供的key值为空串</remarks>

        public virtual string this[string key]
        
{
            
get
            
{
                
if (string.IsNullOrEmpty(key))
                    
throw new ArgumentNullException("key");

                
string value;
                
if (dictionary.TryGetValue(key, out value))
                    
return value;
                
else
                    
return string.Empty;
            }

            
set
            
{
                
if (string.IsNullOrEmpty(key))
                    
throw new ArgumentNullException("key");

                
if (dictionary.ContainsKey(key))
                    dictionary[key] 
= value;
                
else
                    dictionary.Add(key, value);
            }

        }


        
IXmlSerializable Members


        
ISerializable Members        

        
Helper Methods
    }

}


相应的UnitTest

 1  /// <summary>
 2    /// 测试安全上下文
 3    /// </summary>

 4    [TestClass]
 5    public class SecurityContextFixture
 6    {
 7        /// <summary>
 8        /// Prepare
 9        /// </summary>
10        /// <returns></returns>

11        private SecurityContext CreateContext()
12        {
13            SecurityContext context = new SecurityContext();
14            context["hello"= "world";
15            context["1"= "first";
16            return context;
17        }

18
19        /// <summary>
20        /// 访问SecurityContext
21        /// </summary>

22        [TestMethod]
23        public void TestContextAccess()
24        {
25            SecurityContext context = CreateContext();
26
27            Assert.AreEqual<string>("world", context["hello"]);
28            Assert.AreEqual<string>("first", context["1"]);
29            Assert.IsTrue(string.IsNullOrEmpty(context["2"]));
30
31            context["1"= "First";
32            Assert.AreEqual<string>("First", context["1"]);
33        }

34
35        /// <summary>
36        /// 主要确认是否可以被Binary序列化,尤其是用于远程调用
37        /// </summary>

38        [TestMethod]
39        public void TestBinarySerializeContext()
40        {
41            // 测试序列化
42            SecurityContext temp = CreateContext();
43            string tempGraph = SerializationHelper.SerializeObjectToString(temp, SerializationFormatterType.Binary);
44            Trace.WriteLine(tempGraph);
45            SecurityContext context = SerializationHelper.DeserializeStringToObject<SecurityContext>(tempGraph, SerializationFormatterType.Binary);
46
47            Assert.AreEqual<string>("world", context["hello"]);
48            Assert.AreEqual<string>("first", context["1"]);
49            Assert.IsTrue(string.IsNullOrEmpty(context["2"]));
50
51            string graph = SerializationHelper.SerializeObjectToString(context, SerializationFormatterType.Binary);
52            Trace.WriteLine(graph);
53            Assert.AreEqual<string>(tempGraph, graph);
54
55            // 测试序列化的结构是两个完全不同的实例
56            temp["2"= "Second";
57            Assert.IsTrue(string.IsNullOrEmpty(context["2"]));
58            context["2"= "";
59            Assert.AreNotEqual<string>(context["2"], temp["2"]);
60            Trace.WriteLine(context["2"]);
61            Trace.WriteLine(temp["2"]);
62        }

63
64        /// <summary>
65        /// 主要确认是否可以被Soap序列化,尤其是用于远程调用
66        /// </summary>

67        [TestMethod]
68        public void TestSoapSerializeContext()
69        {
70            // 测试序列化
71            SecurityContext temp = CreateContext();
72            string tempGraph = SerializationHelper.SerializeObjectToString(temp, SerializationFormatterType.Soap);
73            Trace.WriteLine(tempGraph);
74            SecurityContext context = SerializationHelper.DeserializeStringToObject<SecurityContext>(tempGraph, SerializationFormatterType.Soap);
75
76            Assert.AreEqual<string>("world", context["hello"]);
77            Assert.AreEqual<string>("first", context["1"]);
78            Assert.IsTrue(string.IsNullOrEmpty(context["2"]));
79
80            string graph = SerializationHelper.SerializeObjectToString(context, SerializationFormatterType.Soap);
81            Trace.WriteLine(graph);
82            Assert.AreEqual<string>(tempGraph, graph);
83            byte[] buffer = Convert.FromBase64String(graph);
84            string soap = Encoding.Default.GetString(buffer);
85            Trace.WriteLine(soap);
86            
87
88            // 测试序列化的结构是两个完全不同的实例
89            temp["2"= "Second";
90            Assert.IsTrue(string.IsNullOrEmpty(context["2"]));
91            context["2"= "";
92            Assert.AreNotEqual<string>(context["2"], temp["2"]);
93            Trace.WriteLine(context["2"]);
94            Trace.WriteLine(temp["2"]);
95        }

96    }

97

这里SerializationHelper是对一个简单的序列化工具类型
    public enum SerializationFormatterType
    
{
        Soap,
        Binary
    }



    
public static class SerializationHelper
    
{
        
Helper method

        
public static string SerializeObjectToString(object graph, SerializationFormatterType formatterType)
        
{
            
using (MemoryStream memoryStream = new MemoryStream())
            
{
                IRemotingFormatter formatter 
= GetFormatter(formatterType);
                formatter.Serialize(memoryStream, graph);
                Byte[] arrGraph 
= memoryStream.ToArray();
                
return Convert.ToBase64String(arrGraph);
            }

        }


        
public static T DeserializeStringToObject<T>(string serializedGraph, SerializationFormatterType formatterType)
        
{
            Byte[] arrGraph 
= Convert.FromBase64String(serializedGraph);
            
using (MemoryStream memoryStream = new MemoryStream(arrGraph))
            
{
                IRemotingFormatter formatter 
= GetFormatter(formatterType);
                
return (T)formatter.Deserialize(memoryStream);
            }

        }

    }