Statistics
| Branch: | Revision:

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