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 | } |