Added hammock project to debug streaming issues
[pithos-ms-client] / trunk / hammock / src / net35 / Hammock / Serialization / HammockDataContractSerializer.cs
1 using System;
2 using System.Collections.Generic;
3 #if NET40
4 using System.Dynamic;
5 #endif
6 using System.IO;
7 using System.Runtime.Serialization;
8 using System.Xml;
9 #if !NET20
10 using System.Xml.Linq;
11 #endif
12
13 namespace Hammock.Serialization
14 {
15 #if !SILVERLIGHT
16     [Serializable]
17 #endif
18     public class HammockDataContractSerializer : Utf8Serializer, ISerializer, IDeserializer
19     {
20         private readonly Dictionary<RuntimeTypeHandle, DataContractSerializer> _serializers =
21             new Dictionary<RuntimeTypeHandle, DataContractSerializer>();
22
23 #if !SILVERLIGHT
24         [NonSerialized]
25 #endif
26         private readonly XmlWriterSettings _settings;
27
28         public HammockDataContractSerializer(XmlWriterSettings settings)
29         {
30             _settings = settings;
31         }
32
33         #region IDeserializer Members
34
35         public virtual object Deserialize(RestResponseBase response, Type type)
36         {
37             using (var stringReader = new StringReader(response.Content))
38             {
39                 var xmlRoot = XElement.Load(stringReader);
40                 var serializer = CacheOrGetSerializerFor(type);
41
42                 using (var reader = xmlRoot.CreateReader())
43                 {
44                     return serializer.ReadObject(reader);
45                 }
46             }
47         }
48
49         public virtual T Deserialize<T>(RestResponseBase response)
50         {
51             using (var stringReader = new StringReader(response.Content))
52             {
53                 var xmlRoot = XElement.Load(stringReader);
54                 var serializer = CacheOrGetSerializerFor(typeof (T));
55
56                 using (var reader = xmlRoot.CreateReader())
57                 {
58                     return (T) serializer.ReadObject(reader);
59                 }
60             }
61         }
62
63 #if NET40
64         public dynamic DeserializeDynamic(RestResponseBase response)
65         {
66             throw new NotSupportedException();
67         }
68 #endif
69
70         #endregion
71
72         #region ISerializer Members
73
74         public virtual string Serialize(object instance, Type type)
75         {
76             string result;
77
78             using (var stream = new MemoryStream())
79             {
80                 using (var writer = XmlWriter.Create(stream, _settings))
81                 {
82
83                     var serializer = CacheOrGetSerializerFor(type);
84                     writer.WriteStartDocument();
85                     serializer.WriteObject(writer, instance);
86                     writer.Flush();
87                 }
88
89                 var data = stream.ToArray();
90                 result = ContentEncoding.GetString(data, 0, data.Length);
91             }
92
93             return result;
94         }
95
96         public virtual string ContentType
97         {
98             get { return "application/xml"; }
99         }
100
101         #endregion
102
103         private DataContractSerializer CacheOrGetSerializerFor(Type type)
104         {
105             var handle = type.TypeHandle;
106             if (_serializers.ContainsKey(handle))
107             {
108                 return _serializers[handle];
109             }
110
111             var serializer = new DataContractSerializer(type);
112             _serializers.Add(handle, serializer);
113
114             return serializer;
115         }
116     }
117 }