Statistics
| Branch: | Revision:

root / trunk / hammock / src / net35 / Hammock.Extras / Serialization / SerializerBase.cs @ 0eea575a

History | View | Annotate | Download (6.4 kB)

1
using System;
2
#if NET40
3
using System.Dynamic;
4
#endif
5
using System.IO;
6
using System.Xml;
7
using Hammock.Serialization;
8
using Newtonsoft.Json;
9
using Newtonsoft.Json.Linq;
10
using Formatting = Newtonsoft.Json.Formatting;
11

    
12
namespace Hammock.Extras.Serialization
13
{
14
    public abstract class SerializerBase : Utf8Serializer, ISerializer, IDeserializer
15
    {
16
        private readonly Newtonsoft.Json.JsonSerializer _serializer;
17

    
18
        protected SerializerBase()
19
            : this(new JsonSerializerSettings
20
                       {
21
                           MissingMemberHandling = MissingMemberHandling.Ignore,
22
                           NullValueHandling = NullValueHandling.Ignore,
23
                           DefaultValueHandling = DefaultValueHandling.Include,
24
                           ContractResolver = new JsonConventionResolver()
25
                       })
26
        {
27

    
28
        }
29

    
30
        protected SerializerBase(JsonSerializerSettings settings)
31
        {
32
            _serializer = new Newtonsoft.Json.JsonSerializer
33
                              {
34
                                  ConstructorHandling = settings.ConstructorHandling,
35
                                  ContractResolver = settings.ContractResolver,
36
                                  ObjectCreationHandling = settings.ObjectCreationHandling,
37
                                  MissingMemberHandling = settings.MissingMemberHandling,
38
                                  DefaultValueHandling = settings.DefaultValueHandling,
39
                                  NullValueHandling = settings.NullValueHandling
40
                              };
41

    
42
            foreach (var converter in settings.Converters)
43
            {
44
                _serializer.Converters.Add(converter);
45
            }
46
        }
47

    
48
        public abstract T Deserialize<T>(RestResponse<T> response);
49

    
50
        public abstract object Deserialize(RestResponse response, Type type);
51

    
52
#if NET40
53
        public abstract dynamic DeserializeDynamic<T>(RestResponse<T> response) where T : DynamicObject;
54
#endif
55
        
56
        public virtual object DeserializeJson(string content, Type type)
57
        {
58
            using (var stringReader = new StringReader(content))
59
            {
60
                using (var jsonTextReader = new JsonTextReader(stringReader))
61
                {
62
                    return _serializer.Deserialize(jsonTextReader, type);
63
                }
64
            }
65
        }
66

    
67
        public virtual T DeserializeJson<T>(string content)
68
        {
69
            using (var stringReader = new StringReader(content))
70
            {
71
                using (var jsonTextReader = new JsonTextReader(stringReader))
72
                {
73
                    return _serializer.Deserialize<T>(jsonTextReader);
74
                }
75
            }
76
        }
77

    
78
        public virtual T DeserializeXml<T>(RestResponse response)
79
        {
80
            return (T)DeserializeXml(response, typeof(T));
81
        }
82

    
83
        public virtual object DeserializeXml(RestResponse response, Type type)
84
        {
85
            var element = LoadXmlElement(response.Content);
86

    
87
            return DeserializeXmlImpl(element, type);
88
        }
89

    
90
        private object DeserializeXmlImpl(XmlNode node, Type type)
91
        {
92
            var json = JsonConvert.SerializeXmlNode(node);
93
            var instance = DeserializeJson(json, type);
94
            return instance;
95
        }
96

    
97
        private static XmlElement LoadXmlElement(string content)
98
        {
99
            var document = new XmlDocument();
100
            document.Load(new StringReader(content));
101
            return document.DocumentElement;
102
        }
103

    
104
        public virtual object DeserializeXmlWithRoot(string content, Type type, string root)
105
        {
106
            var source = LoadXmlElement(content);
107
            var inner = source.FirstChild;
108

    
109
            var document = new XmlDocument();
110
            var outer = document.CreateNode(XmlNodeType.Element, root, source.NamespaceURI);
111
            inner = document.ImportNode(inner, true);
112

    
113
            foreach(XmlAttribute attribute in source.Attributes)
114
            {
115
                var attributeCopy = document.CreateAttribute(attribute.Name, attribute.LocalName, attribute.NamespaceURI);
116
                attributeCopy.Value = attribute.Value;
117
                if (outer.Attributes != null)
118
                {
119
                    outer.Attributes.Append(attributeCopy);
120
                }
121
            }
122

    
123
            outer.AppendChild(inner);
124
            document.AppendChild(outer);
125

    
126
            var json = JsonConvert.SerializeXmlNode(document);
127
            var relevant = JObject.Parse(json)[root].ToString();
128
            var instance = DeserializeJson(relevant, type);
129
            
130
            return instance;
131
        }
132

    
133
        public virtual string SerializeJson(object instance, Type type)
134
        {
135
            using (var stringWriter = new StringWriter())
136
            {
137
                using (var jsonTextWriter = new JsonTextWriter(stringWriter))
138
                {
139
                    jsonTextWriter.Formatting = Formatting.Indented;
140
                    jsonTextWriter.QuoteChar = '"';
141

    
142
                    _serializer.Serialize(jsonTextWriter, instance);
143

    
144
                    var result = stringWriter.ToString();
145
                    return result;
146
                }
147
            }
148
        }
149

    
150
        public virtual string SerializeXml(object instance, Type type)
151
        {
152
            var json = SerializeJson(instance, type);
153

    
154
            var root = type.Name.ToLowerInvariant();
155

    
156
            return SerializeXmlImpl(instance, type, json, root);
157
        }
158

    
159
        public virtual string SerializeXmlWithRoot(object instance, Type type, string root)
160
        {
161
            var json = SerializeJson(instance, type);
162

    
163
            return SerializeXmlImpl(instance, type, json, root);
164
        }
165

    
166
        public virtual string SerializeXmlImpl(object instance, Type type, string json, string root)
167
        {
168
            // {"root":json }
169
            json = string.Format("{{\"{0}\":{1} }}", root, json);
170

    
171
            var document = JsonConvert.DeserializeXmlNode(json);
172

    
173
            using (var stringWriter = new StringWriter())
174
            {
175
                using (var xmlTextWriter = new XmlTextWriter(stringWriter))
176
                {
177
                    document.WriteTo(xmlTextWriter);
178

    
179
                    return stringWriter.ToString();
180
                }
181
            }
182
        }
183

    
184
        public abstract string Serialize(object instance, Type type);
185

    
186
        public abstract string ContentType { get; }
187
    }
188
}