Statistics
| Branch: | Revision:

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

History | View | Annotate | Download (6.4 kB)

1 0eea575a Panagiotis Kanavos
using System;
2 0eea575a Panagiotis Kanavos
#if NET40
3 0eea575a Panagiotis Kanavos
using System.Dynamic;
4 0eea575a Panagiotis Kanavos
#endif
5 0eea575a Panagiotis Kanavos
using System.IO;
6 0eea575a Panagiotis Kanavos
using System.Xml;
7 0eea575a Panagiotis Kanavos
using Hammock.Serialization;
8 0eea575a Panagiotis Kanavos
using Newtonsoft.Json;
9 0eea575a Panagiotis Kanavos
using Newtonsoft.Json.Linq;
10 0eea575a Panagiotis Kanavos
using Formatting = Newtonsoft.Json.Formatting;
11 0eea575a Panagiotis Kanavos
12 0eea575a Panagiotis Kanavos
namespace Hammock.Extras.Serialization
13 0eea575a Panagiotis Kanavos
{
14 0eea575a Panagiotis Kanavos
    public abstract class SerializerBase : Utf8Serializer, ISerializer, IDeserializer
15 0eea575a Panagiotis Kanavos
    {
16 0eea575a Panagiotis Kanavos
        private readonly Newtonsoft.Json.JsonSerializer _serializer;
17 0eea575a Panagiotis Kanavos
18 0eea575a Panagiotis Kanavos
        protected SerializerBase()
19 0eea575a Panagiotis Kanavos
            : this(new JsonSerializerSettings
20 0eea575a Panagiotis Kanavos
                       {
21 0eea575a Panagiotis Kanavos
                           MissingMemberHandling = MissingMemberHandling.Ignore,
22 0eea575a Panagiotis Kanavos
                           NullValueHandling = NullValueHandling.Ignore,
23 0eea575a Panagiotis Kanavos
                           DefaultValueHandling = DefaultValueHandling.Include,
24 0eea575a Panagiotis Kanavos
                           ContractResolver = new JsonConventionResolver()
25 0eea575a Panagiotis Kanavos
                       })
26 0eea575a Panagiotis Kanavos
        {
27 0eea575a Panagiotis Kanavos
28 0eea575a Panagiotis Kanavos
        }
29 0eea575a Panagiotis Kanavos
30 0eea575a Panagiotis Kanavos
        protected SerializerBase(JsonSerializerSettings settings)
31 0eea575a Panagiotis Kanavos
        {
32 0eea575a Panagiotis Kanavos
            _serializer = new Newtonsoft.Json.JsonSerializer
33 0eea575a Panagiotis Kanavos
                              {
34 0eea575a Panagiotis Kanavos
                                  ConstructorHandling = settings.ConstructorHandling,
35 0eea575a Panagiotis Kanavos
                                  ContractResolver = settings.ContractResolver,
36 0eea575a Panagiotis Kanavos
                                  ObjectCreationHandling = settings.ObjectCreationHandling,
37 0eea575a Panagiotis Kanavos
                                  MissingMemberHandling = settings.MissingMemberHandling,
38 0eea575a Panagiotis Kanavos
                                  DefaultValueHandling = settings.DefaultValueHandling,
39 0eea575a Panagiotis Kanavos
                                  NullValueHandling = settings.NullValueHandling
40 0eea575a Panagiotis Kanavos
                              };
41 0eea575a Panagiotis Kanavos
42 0eea575a Panagiotis Kanavos
            foreach (var converter in settings.Converters)
43 0eea575a Panagiotis Kanavos
            {
44 0eea575a Panagiotis Kanavos
                _serializer.Converters.Add(converter);
45 0eea575a Panagiotis Kanavos
            }
46 0eea575a Panagiotis Kanavos
        }
47 0eea575a Panagiotis Kanavos
48 0eea575a Panagiotis Kanavos
        public abstract T Deserialize<T>(RestResponse<T> response);
49 0eea575a Panagiotis Kanavos
50 0eea575a Panagiotis Kanavos
        public abstract object Deserialize(RestResponse response, Type type);
51 0eea575a Panagiotis Kanavos
52 0eea575a Panagiotis Kanavos
#if NET40
53 0eea575a Panagiotis Kanavos
        public abstract dynamic DeserializeDynamic<T>(RestResponse<T> response) where T : DynamicObject;
54 0eea575a Panagiotis Kanavos
#endif
55 0eea575a Panagiotis Kanavos
        
56 0eea575a Panagiotis Kanavos
        public virtual object DeserializeJson(string content, Type type)
57 0eea575a Panagiotis Kanavos
        {
58 0eea575a Panagiotis Kanavos
            using (var stringReader = new StringReader(content))
59 0eea575a Panagiotis Kanavos
            {
60 0eea575a Panagiotis Kanavos
                using (var jsonTextReader = new JsonTextReader(stringReader))
61 0eea575a Panagiotis Kanavos
                {
62 0eea575a Panagiotis Kanavos
                    return _serializer.Deserialize(jsonTextReader, type);
63 0eea575a Panagiotis Kanavos
                }
64 0eea575a Panagiotis Kanavos
            }
65 0eea575a Panagiotis Kanavos
        }
66 0eea575a Panagiotis Kanavos
67 0eea575a Panagiotis Kanavos
        public virtual T DeserializeJson<T>(string content)
68 0eea575a Panagiotis Kanavos
        {
69 0eea575a Panagiotis Kanavos
            using (var stringReader = new StringReader(content))
70 0eea575a Panagiotis Kanavos
            {
71 0eea575a Panagiotis Kanavos
                using (var jsonTextReader = new JsonTextReader(stringReader))
72 0eea575a Panagiotis Kanavos
                {
73 0eea575a Panagiotis Kanavos
                    return _serializer.Deserialize<T>(jsonTextReader);
74 0eea575a Panagiotis Kanavos
                }
75 0eea575a Panagiotis Kanavos
            }
76 0eea575a Panagiotis Kanavos
        }
77 0eea575a Panagiotis Kanavos
78 0eea575a Panagiotis Kanavos
        public virtual T DeserializeXml<T>(RestResponse response)
79 0eea575a Panagiotis Kanavos
        {
80 0eea575a Panagiotis Kanavos
            return (T)DeserializeXml(response, typeof(T));
81 0eea575a Panagiotis Kanavos
        }
82 0eea575a Panagiotis Kanavos
83 0eea575a Panagiotis Kanavos
        public virtual object DeserializeXml(RestResponse response, Type type)
84 0eea575a Panagiotis Kanavos
        {
85 0eea575a Panagiotis Kanavos
            var element = LoadXmlElement(response.Content);
86 0eea575a Panagiotis Kanavos
87 0eea575a Panagiotis Kanavos
            return DeserializeXmlImpl(element, type);
88 0eea575a Panagiotis Kanavos
        }
89 0eea575a Panagiotis Kanavos
90 0eea575a Panagiotis Kanavos
        private object DeserializeXmlImpl(XmlNode node, Type type)
91 0eea575a Panagiotis Kanavos
        {
92 0eea575a Panagiotis Kanavos
            var json = JsonConvert.SerializeXmlNode(node);
93 0eea575a Panagiotis Kanavos
            var instance = DeserializeJson(json, type);
94 0eea575a Panagiotis Kanavos
            return instance;
95 0eea575a Panagiotis Kanavos
        }
96 0eea575a Panagiotis Kanavos
97 0eea575a Panagiotis Kanavos
        private static XmlElement LoadXmlElement(string content)
98 0eea575a Panagiotis Kanavos
        {
99 0eea575a Panagiotis Kanavos
            var document = new XmlDocument();
100 0eea575a Panagiotis Kanavos
            document.Load(new StringReader(content));
101 0eea575a Panagiotis Kanavos
            return document.DocumentElement;
102 0eea575a Panagiotis Kanavos
        }
103 0eea575a Panagiotis Kanavos
104 0eea575a Panagiotis Kanavos
        public virtual object DeserializeXmlWithRoot(string content, Type type, string root)
105 0eea575a Panagiotis Kanavos
        {
106 0eea575a Panagiotis Kanavos
            var source = LoadXmlElement(content);
107 0eea575a Panagiotis Kanavos
            var inner = source.FirstChild;
108 0eea575a Panagiotis Kanavos
109 0eea575a Panagiotis Kanavos
            var document = new XmlDocument();
110 0eea575a Panagiotis Kanavos
            var outer = document.CreateNode(XmlNodeType.Element, root, source.NamespaceURI);
111 0eea575a Panagiotis Kanavos
            inner = document.ImportNode(inner, true);
112 0eea575a Panagiotis Kanavos
113 0eea575a Panagiotis Kanavos
            foreach(XmlAttribute attribute in source.Attributes)
114 0eea575a Panagiotis Kanavos
            {
115 0eea575a Panagiotis Kanavos
                var attributeCopy = document.CreateAttribute(attribute.Name, attribute.LocalName, attribute.NamespaceURI);
116 0eea575a Panagiotis Kanavos
                attributeCopy.Value = attribute.Value;
117 0eea575a Panagiotis Kanavos
                if (outer.Attributes != null)
118 0eea575a Panagiotis Kanavos
                {
119 0eea575a Panagiotis Kanavos
                    outer.Attributes.Append(attributeCopy);
120 0eea575a Panagiotis Kanavos
                }
121 0eea575a Panagiotis Kanavos
            }
122 0eea575a Panagiotis Kanavos
123 0eea575a Panagiotis Kanavos
            outer.AppendChild(inner);
124 0eea575a Panagiotis Kanavos
            document.AppendChild(outer);
125 0eea575a Panagiotis Kanavos
126 0eea575a Panagiotis Kanavos
            var json = JsonConvert.SerializeXmlNode(document);
127 0eea575a Panagiotis Kanavos
            var relevant = JObject.Parse(json)[root].ToString();
128 0eea575a Panagiotis Kanavos
            var instance = DeserializeJson(relevant, type);
129 0eea575a Panagiotis Kanavos
            
130 0eea575a Panagiotis Kanavos
            return instance;
131 0eea575a Panagiotis Kanavos
        }
132 0eea575a Panagiotis Kanavos
133 0eea575a Panagiotis Kanavos
        public virtual string SerializeJson(object instance, Type type)
134 0eea575a Panagiotis Kanavos
        {
135 0eea575a Panagiotis Kanavos
            using (var stringWriter = new StringWriter())
136 0eea575a Panagiotis Kanavos
            {
137 0eea575a Panagiotis Kanavos
                using (var jsonTextWriter = new JsonTextWriter(stringWriter))
138 0eea575a Panagiotis Kanavos
                {
139 0eea575a Panagiotis Kanavos
                    jsonTextWriter.Formatting = Formatting.Indented;
140 0eea575a Panagiotis Kanavos
                    jsonTextWriter.QuoteChar = '"';
141 0eea575a Panagiotis Kanavos
142 0eea575a Panagiotis Kanavos
                    _serializer.Serialize(jsonTextWriter, instance);
143 0eea575a Panagiotis Kanavos
144 0eea575a Panagiotis Kanavos
                    var result = stringWriter.ToString();
145 0eea575a Panagiotis Kanavos
                    return result;
146 0eea575a Panagiotis Kanavos
                }
147 0eea575a Panagiotis Kanavos
            }
148 0eea575a Panagiotis Kanavos
        }
149 0eea575a Panagiotis Kanavos
150 0eea575a Panagiotis Kanavos
        public virtual string SerializeXml(object instance, Type type)
151 0eea575a Panagiotis Kanavos
        {
152 0eea575a Panagiotis Kanavos
            var json = SerializeJson(instance, type);
153 0eea575a Panagiotis Kanavos
154 0eea575a Panagiotis Kanavos
            var root = type.Name.ToLowerInvariant();
155 0eea575a Panagiotis Kanavos
156 0eea575a Panagiotis Kanavos
            return SerializeXmlImpl(instance, type, json, root);
157 0eea575a Panagiotis Kanavos
        }
158 0eea575a Panagiotis Kanavos
159 0eea575a Panagiotis Kanavos
        public virtual string SerializeXmlWithRoot(object instance, Type type, string root)
160 0eea575a Panagiotis Kanavos
        {
161 0eea575a Panagiotis Kanavos
            var json = SerializeJson(instance, type);
162 0eea575a Panagiotis Kanavos
163 0eea575a Panagiotis Kanavos
            return SerializeXmlImpl(instance, type, json, root);
164 0eea575a Panagiotis Kanavos
        }
165 0eea575a Panagiotis Kanavos
166 0eea575a Panagiotis Kanavos
        public virtual string SerializeXmlImpl(object instance, Type type, string json, string root)
167 0eea575a Panagiotis Kanavos
        {
168 0eea575a Panagiotis Kanavos
            // {"root":json }
169 0eea575a Panagiotis Kanavos
            json = string.Format("{{\"{0}\":{1} }}", root, json);
170 0eea575a Panagiotis Kanavos
171 0eea575a Panagiotis Kanavos
            var document = JsonConvert.DeserializeXmlNode(json);
172 0eea575a Panagiotis Kanavos
173 0eea575a Panagiotis Kanavos
            using (var stringWriter = new StringWriter())
174 0eea575a Panagiotis Kanavos
            {
175 0eea575a Panagiotis Kanavos
                using (var xmlTextWriter = new XmlTextWriter(stringWriter))
176 0eea575a Panagiotis Kanavos
                {
177 0eea575a Panagiotis Kanavos
                    document.WriteTo(xmlTextWriter);
178 0eea575a Panagiotis Kanavos
179 0eea575a Panagiotis Kanavos
                    return stringWriter.ToString();
180 0eea575a Panagiotis Kanavos
                }
181 0eea575a Panagiotis Kanavos
            }
182 0eea575a Panagiotis Kanavos
        }
183 0eea575a Panagiotis Kanavos
184 0eea575a Panagiotis Kanavos
        public abstract string Serialize(object instance, Type type);
185 0eea575a Panagiotis Kanavos
186 0eea575a Panagiotis Kanavos
        public abstract string ContentType { get; }
187 0eea575a Panagiotis Kanavos
    }
188 0eea575a Panagiotis Kanavos
}