Last active
October 27, 2017 22:21
-
-
Save eocron/50a5aae580779bf0b8bfd25924e96bc7 to your computer and use it in GitHub Desktop.
Just another JSON/XML serializer/deserializer on DataContract without external dependencies. Also have human-readable xml serializer.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.IO; | |
using System.Runtime.Serialization; | |
using System.Runtime.Serialization.Json; | |
using System.Text; | |
using System.Xml; | |
namespace Helpers | |
{ | |
public static class JsonHelper | |
{ | |
public static string SerializeObject(object obj) | |
{ | |
if (obj == null) | |
return String.Empty; | |
using (var ms = new MemoryStream()) | |
{ | |
var ser = new DataContractJsonSerializer(obj.GetType()); | |
ser.WriteObject(ms, obj); | |
return Encoding.UTF8.GetString(ms.ToArray()); | |
} | |
} | |
public static T DeserializeObject<T>(string json) | |
{ | |
if (string.IsNullOrWhiteSpace(json)) | |
return default(T); | |
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json))) | |
{ | |
var ser = new DataContractJsonSerializer(typeof(T)); | |
return (T) ser.ReadObject(ms); | |
} | |
} | |
} | |
public static class XmlHelper | |
{ | |
private static readonly XmlWriterSettings DefaultW = new XmlWriterSettings | |
{ | |
Indent = true, | |
NamespaceHandling = NamespaceHandling.OmitDuplicates, | |
}; | |
private static readonly XmlReaderSettings DefaultR = new XmlReaderSettings(); | |
public static string ReadableSerializeObject(object obj) | |
{ | |
if (obj == null) | |
return String.Empty; | |
using (var ms = new MemoryStream()) | |
{ | |
using (var w = new SimplisticXmlWriter(XmlWriter.Create(ms, DefaultW))) | |
{ | |
var ser = new DataContractSerializer(obj.GetType(), obj.GetType().Name, ""); | |
ser.WriteObject(w, obj); | |
} | |
return Encoding.UTF8.GetString(ms.ToArray()); | |
} | |
} | |
public static string SerializeObject(object obj, XmlWriterSettings settings = null) | |
{ | |
if(obj == null) | |
return String.Empty; | |
settings = settings ?? DefaultW; | |
using (var ms = new MemoryStream()) | |
{ | |
using (var w = XmlWriter.Create(ms,settings)) | |
{ | |
var ser = new DataContractSerializer(obj.GetType()); | |
ser.WriteObject(w, obj); | |
} | |
return Encoding.UTF8.GetString(ms.ToArray()); | |
} | |
} | |
public static T DeserializeObject<T>(string xml, XmlReaderSettings settings = null) | |
{ | |
if (string.IsNullOrWhiteSpace(xml)) | |
return default(T); | |
settings = settings ?? DefaultR; | |
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml))) | |
{ | |
using (var w = XmlReader.Create(ms, settings)) | |
{ | |
var ser = new DataContractSerializer(typeof(T)); | |
return (T) ser.ReadObject(w); | |
} | |
} | |
} | |
private sealed class SimplisticXmlWriter : XmlWriter | |
{ | |
private readonly XmlWriter _inner; | |
public SimplisticXmlWriter(XmlWriter xmlWriterImplementation) | |
{ | |
_inner = xmlWriterImplementation; | |
} | |
public override void WriteStartDocument() | |
{ | |
_inner.WriteStartDocument(); | |
} | |
public override void WriteStartDocument(bool standalone) | |
{ | |
_inner.WriteStartDocument(standalone); | |
} | |
public override void WriteEndDocument() | |
{ | |
_inner.WriteEndDocument(); | |
} | |
public override void WriteDocType(string name, string pubid, string sysid, string subset) | |
{ | |
_inner.WriteDocType(name, pubid, sysid, subset); | |
} | |
public override void WriteStartElement(string prefix, string localName, string ns) | |
{ | |
_inner.WriteStartElement(null, localName, ""); | |
} | |
public override void WriteEndElement() | |
{ | |
_inner.WriteEndElement(); | |
} | |
public override void WriteFullEndElement() | |
{ | |
_inner.WriteFullEndElement(); | |
} | |
private bool _ignoreXmlns = false; | |
public override void WriteStartAttribute(string prefix, string localName, string ns) | |
{ | |
if (String.Compare(prefix, "xmlns", StringComparison.OrdinalIgnoreCase) == 0) | |
{ | |
_ignoreXmlns = true; | |
return; | |
} | |
_inner.WriteStartAttribute(prefix, localName, ns); | |
} | |
public override void WriteEndAttribute() | |
{ | |
if (_ignoreXmlns) | |
{ | |
_ignoreXmlns = false; | |
return; | |
} | |
_inner.WriteEndAttribute(); | |
} | |
public override void WriteCData(string text) | |
{ | |
_inner.WriteCData(text); | |
} | |
public override void WriteComment(string text) | |
{ | |
_inner.WriteComment(text); | |
} | |
public override void WriteProcessingInstruction(string name, string text) | |
{ | |
_inner.WriteProcessingInstruction(name, text); | |
} | |
public override void WriteEntityRef(string name) | |
{ | |
_inner.WriteEntityRef(name); | |
} | |
public override void WriteCharEntity(char ch) | |
{ | |
_inner.WriteCharEntity(ch); | |
} | |
public override void WriteWhitespace(string ws) | |
{ | |
_inner.WriteWhitespace(ws); | |
} | |
public override void WriteString(string text) | |
{ | |
if(_ignoreXmlns) | |
return; | |
_inner.WriteString(text); | |
} | |
public override void WriteSurrogateCharEntity(char lowChar, char highChar) | |
{ | |
_inner.WriteSurrogateCharEntity(lowChar, highChar); | |
} | |
public override void WriteChars(char[] buffer, int index, int count) | |
{ | |
_inner.WriteChars(buffer, index, count); | |
} | |
public override void WriteRaw(char[] buffer, int index, int count) | |
{ | |
_inner.WriteRaw(buffer, index, count); | |
} | |
public override void WriteRaw(string data) | |
{ | |
_inner.WriteRaw(data); | |
} | |
public override void WriteBase64(byte[] buffer, int index, int count) | |
{ | |
_inner.WriteBase64(buffer, index, count); | |
} | |
public override void Close() | |
{ | |
_inner.Close(); | |
} | |
public override void Flush() | |
{ | |
_inner.Flush(); | |
} | |
public override string LookupPrefix(string ns) | |
{ | |
return ""; | |
} | |
public override WriteState WriteState => _inner.WriteState; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment