2 using System.Collections.Generic;
7 using System.Runtime.Serialization;
10 using System.Xml.Linq;
13 namespace Hammock.Serialization
18 public class HammockDataContractSerializer : Utf8Serializer, ISerializer, IDeserializer
20 private readonly Dictionary<RuntimeTypeHandle, DataContractSerializer> _serializers =
21 new Dictionary<RuntimeTypeHandle, DataContractSerializer>();
26 private readonly XmlWriterSettings _settings;
28 public HammockDataContractSerializer(XmlWriterSettings settings)
33 #region IDeserializer Members
35 public virtual object Deserialize(RestResponseBase response, Type type)
37 using (var stringReader = new StringReader(response.Content))
39 var xmlRoot = XElement.Load(stringReader);
40 var serializer = CacheOrGetSerializerFor(type);
42 using (var reader = xmlRoot.CreateReader())
44 return serializer.ReadObject(reader);
49 public virtual T Deserialize<T>(RestResponseBase response)
51 using (var stringReader = new StringReader(response.Content))
53 var xmlRoot = XElement.Load(stringReader);
54 var serializer = CacheOrGetSerializerFor(typeof (T));
56 using (var reader = xmlRoot.CreateReader())
58 return (T) serializer.ReadObject(reader);
64 public dynamic DeserializeDynamic(RestResponseBase response)
66 throw new NotSupportedException();
72 #region ISerializer Members
74 public virtual string Serialize(object instance, Type type)
78 using (var stream = new MemoryStream())
80 using (var writer = XmlWriter.Create(stream, _settings))
83 var serializer = CacheOrGetSerializerFor(type);
84 writer.WriteStartDocument();
85 serializer.WriteObject(writer, instance);
89 var data = stream.ToArray();
90 result = ContentEncoding.GetString(data, 0, data.Length);
96 public virtual string ContentType
98 get { return "application/xml"; }
103 private DataContractSerializer CacheOrGetSerializerFor(Type type)
105 var handle = type.TypeHandle;
106 if (_serializers.ContainsKey(handle))
108 return _serializers[handle];
111 var serializer = new DataContractSerializer(type);
112 _serializers.Add(handle, serializer);