同时支持二进制(binary)和SOAP (Web Service / WCF) 序列化的泛型集合类型处理
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
/// <summary>2
/// 测试安全上下文3
/// </summary>4
[TestClass]5
public class SecurityContextFixture6
{7
/// <summary>8
/// Prepare9
/// </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
/// 访问SecurityContext21
/// </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);
}
}
}贸易电子化,技术全球化


浙公网安备 33010602011771号