Added hammock project to debug streaming issues
[pithos-ms-client] / trunk / hammock / src / net35 / Hammock / Serialization / HammockDataContractJsonSerializer.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.Json;
8
9 namespace Hammock.Serialization
10 {
11 #if !SILVERLIGHT
12     [Serializable]
13 #endif
14     public class HammockDataContractJsonSerializer : Utf8Serializer, ISerializer, IDeserializer
15     {
16         private readonly Dictionary<RuntimeTypeHandle, DataContractJsonSerializer> _serializers =
17             new Dictionary<RuntimeTypeHandle, DataContractJsonSerializer>();
18
19         #region ISerializer Members
20
21         public virtual string Serialize(object instance, Type type)
22         {
23             string result;
24             using (var stream = new MemoryStream())
25             {
26                 var serializer = CacheOrGetSerializerFor(type);
27                 serializer.WriteObject(stream, instance);
28
29                 var data = stream.ToArray();
30                 result = ContentEncoding.GetString(data, 0, data.Length);
31             }
32             return result;
33         }
34
35         public virtual string ContentType
36         {
37             get { return "application/json"; }
38         }
39
40         #endregion
41
42         #region IDeserializer Members
43
44         public virtual object Deserialize(RestResponseBase response, Type type)
45         {
46             object instance;
47             using (var stream = new MemoryStream(ContentEncoding.GetBytes(response.Content)))
48             {
49                 var serializer = CacheOrGetSerializerFor(type);
50                 instance = serializer.ReadObject(stream);
51             }
52             return instance;
53         }
54
55         public virtual T Deserialize<T>(RestResponseBase response)
56         {
57             var type = typeof (T);
58             T instance;
59             using (var stream = new MemoryStream(ContentEncoding.GetBytes(response.Content)))
60             {
61                 var serializer = CacheOrGetSerializerFor(type);
62                 instance = (T) serializer.ReadObject(stream);
63             }
64             return instance;
65         }
66
67 #if NET40
68         public dynamic DeserializeDynamic(RestResponseBase response)
69         {
70             throw new NotSupportedException();
71         }
72 #endif
73
74         #endregion
75
76         private DataContractJsonSerializer CacheOrGetSerializerFor(Type type)
77         {
78             var handle = type.TypeHandle;
79             if (_serializers.ContainsKey(handle))
80             {
81                 return _serializers[handle];
82             }
83
84             var serializer = new DataContractJsonSerializer(type);
85             _serializers.Add(handle, serializer);
86
87             return serializer;
88         }
89     }
90 }