root / trunk / hammock / src / net35 / Hammock / Serialization / HammockXmlSerializer.cs @ 0eea575a
History | View | Annotate | Download (3.3 kB)
1 |
using System; |
---|---|
2 |
using System.Collections.Generic; |
3 |
using System.IO; |
4 |
using System.Xml; |
5 |
using System.Xml.Serialization; |
6 |
#if NET40 |
7 |
using System.Dynamic; |
8 |
#endif |
9 |
|
10 |
namespace Hammock.Serialization |
11 |
{ |
12 |
#if !SILVERLIGHT |
13 |
[Serializable] |
14 |
#endif |
15 |
public class HammockXmlSerializer : Utf8Serializer, ISerializer, IDeserializer |
16 |
{ |
17 |
private readonly Dictionary<RuntimeTypeHandle, XmlSerializer> _serializers = |
18 |
new Dictionary<RuntimeTypeHandle, XmlSerializer>(); |
19 |
|
20 |
[NonSerialized] |
21 |
private readonly XmlWriterSettings _settings; |
22 |
|
23 |
[NonSerialized] |
24 |
private readonly XmlSerializerNamespaces _namespaces; |
25 |
|
26 |
public HammockXmlSerializer(XmlWriterSettings settings) |
27 |
{ |
28 |
_settings = settings; |
29 |
} |
30 |
|
31 |
public HammockXmlSerializer(XmlWriterSettings settings, XmlSerializerNamespaces namespaces) : this(settings) |
32 |
{ |
33 |
_namespaces = namespaces; |
34 |
} |
35 |
|
36 |
#region ISerializer Methods |
37 |
|
38 |
public virtual string Serialize(object instance, Type type) |
39 |
{ |
40 |
string result; |
41 |
using (var stream = new MemoryStream()) |
42 |
{ |
43 |
using (var writer = XmlWriter.Create(stream, _settings)) |
44 |
{ |
45 |
var serializer = CacheOrGetSerializerFor(type); |
46 |
|
47 |
if (_namespaces != null) |
48 |
{ |
49 |
serializer.Serialize(writer, instance, _namespaces); |
50 |
} |
51 |
else |
52 |
{ |
53 |
serializer.Serialize(writer, instance); |
54 |
} |
55 |
} |
56 |
|
57 |
#if !Smartphone && !NETCF |
58 |
result = ContentEncoding.GetString(stream.ToArray()); |
59 |
#else |
60 |
result = ContentEncoding.GetString(stream.ToArray(), 0, (int)stream.Length); |
61 |
#endif |
62 |
} |
63 |
return result; |
64 |
} |
65 |
|
66 |
#endregion |
67 |
|
68 |
public virtual string ContentType |
69 |
{ |
70 |
get { return "application/xml"; } |
71 |
} |
72 |
|
73 |
#region IDeserializer Methods |
74 |
|
75 |
public virtual object Deserialize(RestResponseBase response, Type type) |
76 |
{ |
77 |
object instance; |
78 |
var serializer = CacheOrGetSerializerFor(type); |
79 |
using(var reader = new StringReader(response.Content)) |
80 |
{ |
81 |
instance = serializer.Deserialize(reader); |
82 |
} |
83 |
return instance; |
84 |
} |
85 |
|
86 |
public virtual T Deserialize<T>(RestResponseBase response) |
87 |
{ |
88 |
T instance; |
89 |
var serializer = CacheOrGetSerializerFor(typeof(T)); |
90 |
using (var reader = new StringReader(response.Content)) |
91 |
{ |
92 |
instance = (T) serializer.Deserialize(reader); |
93 |
} |
94 |
return instance; |
95 |
} |
96 |
|
97 |
#if NET40 |
98 |
public virtual dynamic DeserializeDynamic(RestResponseBase response) |
99 |
{ |
100 |
var result = Deserialize<dynamic>(response); |
101 |
return result; |
102 |
} |
103 |
#endif |
104 |
|
105 |
#endregion |
106 |
|
107 |
private XmlSerializer CacheOrGetSerializerFor(Type type) |
108 |
{ |
109 |
var handle = type.TypeHandle; |
110 |
if (_serializers.ContainsKey(handle)) |
111 |
{ |
112 |
return _serializers[handle]; |
113 |
} |
114 |
|
115 |
var serializer = new XmlSerializer(type); |
116 |
_serializers.Add(handle, serializer); |
117 |
|
118 |
return serializer; |
119 |
} |
120 |
} |
121 |
} |
122 |
|
123 |
|