7 using Hammock.Serialization;
9 using Newtonsoft.Json.Linq;
10 using Formatting = Newtonsoft.Json.Formatting;
12 namespace Hammock.Extras.Serialization
14 public abstract class SerializerBase : Utf8Serializer, ISerializer, IDeserializer
16 private readonly Newtonsoft.Json.JsonSerializer _serializer;
18 protected SerializerBase()
19 : this(new JsonSerializerSettings
21 MissingMemberHandling = MissingMemberHandling.Ignore,
22 NullValueHandling = NullValueHandling.Ignore,
23 DefaultValueHandling = DefaultValueHandling.Include,
24 ContractResolver = new JsonConventionResolver()
30 protected SerializerBase(JsonSerializerSettings settings)
32 _serializer = new Newtonsoft.Json.JsonSerializer
34 ConstructorHandling = settings.ConstructorHandling,
35 ContractResolver = settings.ContractResolver,
36 ObjectCreationHandling = settings.ObjectCreationHandling,
37 MissingMemberHandling = settings.MissingMemberHandling,
38 DefaultValueHandling = settings.DefaultValueHandling,
39 NullValueHandling = settings.NullValueHandling
42 foreach (var converter in settings.Converters)
44 _serializer.Converters.Add(converter);
48 public abstract T Deserialize<T>(RestResponse<T> response);
50 public abstract object Deserialize(RestResponse response, Type type);
53 public abstract dynamic DeserializeDynamic<T>(RestResponse<T> response) where T : DynamicObject;
56 public virtual object DeserializeJson(string content, Type type)
58 using (var stringReader = new StringReader(content))
60 using (var jsonTextReader = new JsonTextReader(stringReader))
62 return _serializer.Deserialize(jsonTextReader, type);
67 public virtual T DeserializeJson<T>(string content)
69 using (var stringReader = new StringReader(content))
71 using (var jsonTextReader = new JsonTextReader(stringReader))
73 return _serializer.Deserialize<T>(jsonTextReader);
78 public virtual T DeserializeXml<T>(RestResponse response)
80 return (T)DeserializeXml(response, typeof(T));
83 public virtual object DeserializeXml(RestResponse response, Type type)
85 var element = LoadXmlElement(response.Content);
87 return DeserializeXmlImpl(element, type);
90 private object DeserializeXmlImpl(XmlNode node, Type type)
92 var json = JsonConvert.SerializeXmlNode(node);
93 var instance = DeserializeJson(json, type);
97 private static XmlElement LoadXmlElement(string content)
99 var document = new XmlDocument();
100 document.Load(new StringReader(content));
101 return document.DocumentElement;
104 public virtual object DeserializeXmlWithRoot(string content, Type type, string root)
106 var source = LoadXmlElement(content);
107 var inner = source.FirstChild;
109 var document = new XmlDocument();
110 var outer = document.CreateNode(XmlNodeType.Element, root, source.NamespaceURI);
111 inner = document.ImportNode(inner, true);
113 foreach(XmlAttribute attribute in source.Attributes)
115 var attributeCopy = document.CreateAttribute(attribute.Name, attribute.LocalName, attribute.NamespaceURI);
116 attributeCopy.Value = attribute.Value;
117 if (outer.Attributes != null)
119 outer.Attributes.Append(attributeCopy);
123 outer.AppendChild(inner);
124 document.AppendChild(outer);
126 var json = JsonConvert.SerializeXmlNode(document);
127 var relevant = JObject.Parse(json)[root].ToString();
128 var instance = DeserializeJson(relevant, type);
133 public virtual string SerializeJson(object instance, Type type)
135 using (var stringWriter = new StringWriter())
137 using (var jsonTextWriter = new JsonTextWriter(stringWriter))
139 jsonTextWriter.Formatting = Formatting.Indented;
140 jsonTextWriter.QuoteChar = '"';
142 _serializer.Serialize(jsonTextWriter, instance);
144 var result = stringWriter.ToString();
150 public virtual string SerializeXml(object instance, Type type)
152 var json = SerializeJson(instance, type);
154 var root = type.Name.ToLowerInvariant();
156 return SerializeXmlImpl(instance, type, json, root);
159 public virtual string SerializeXmlWithRoot(object instance, Type type, string root)
161 var json = SerializeJson(instance, type);
163 return SerializeXmlImpl(instance, type, json, root);
166 public virtual string SerializeXmlImpl(object instance, Type type, string json, string root)
169 json = string.Format("{{\"{0}\":{1} }}", root, json);
171 var document = JsonConvert.DeserializeXmlNode(json);
173 using (var stringWriter = new StringWriter())
175 using (var xmlTextWriter = new XmlTextWriter(stringWriter))
177 document.WriteTo(xmlTextWriter);
179 return stringWriter.ToString();
184 public abstract string Serialize(object instance, Type type);
186 public abstract string ContentType { get; }