using System; using System.Globalization; using System.IO; using System.Threading.Tasks; using MediaBrowser.Model.Serialization; namespace Emby.Server.Implementations.Serialization { /// /// Provides a wrapper around third party json serialization. /// public class JsonSerializer : IJsonSerializer { public JsonSerializer() { ServiceStack.Text.JsConfig.DateHandler = ServiceStack.Text.DateHandler.ISO8601; ServiceStack.Text.JsConfig.ExcludeTypeInfo = true; ServiceStack.Text.JsConfig.IncludeNullValues = false; ServiceStack.Text.JsConfig.AlwaysUseUtc = true; ServiceStack.Text.JsConfig.AssumeUtc = true; ServiceStack.Text.JsConfig.SerializeFn = SerializeGuid; } /// /// Serializes to stream. /// /// The obj. /// The stream. /// obj public void SerializeToStream(object obj, Stream stream) { if (obj == null) { throw new ArgumentNullException(nameof(obj)); } if (stream == null) { throw new ArgumentNullException(nameof(stream)); } ServiceStack.Text.JsonSerializer.SerializeToStream(obj, obj.GetType(), stream); } /// /// Serializes to stream. /// /// The obj. /// The stream. /// obj public void SerializeToStream(T obj, Stream stream) { if (obj == null) { throw new ArgumentNullException(nameof(obj)); } if (stream == null) { throw new ArgumentNullException(nameof(stream)); } ServiceStack.Text.JsonSerializer.SerializeToStream(obj, stream); } /// /// Serializes to file. /// /// The obj. /// The file. /// obj public void SerializeToFile(object obj, string file) { if (obj == null) { throw new ArgumentNullException(nameof(obj)); } if (string.IsNullOrEmpty(file)) { throw new ArgumentNullException(nameof(file)); } using (var stream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.Read)) { SerializeToStream(obj, stream); } } private static Stream OpenFile(string path) { return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 131072); } /// /// Deserializes from file. /// /// The type. /// The file. /// System.Object. /// type public object DeserializeFromFile(Type type, string file) { if (type == null) { throw new ArgumentNullException(nameof(type)); } if (string.IsNullOrEmpty(file)) { throw new ArgumentNullException(nameof(file)); } using (var stream = OpenFile(file)) { return DeserializeFromStream(stream, type); } } /// /// Deserializes from file. /// /// /// The file. /// ``0. /// file public T DeserializeFromFile(string file) where T : class { if (string.IsNullOrEmpty(file)) { throw new ArgumentNullException(nameof(file)); } using (var stream = OpenFile(file)) { return DeserializeFromStream(stream); } } /// /// Deserializes from stream. /// /// /// The stream. /// ``0. /// stream public T DeserializeFromStream(Stream stream) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } return ServiceStack.Text.JsonSerializer.DeserializeFromStream(stream); } public Task DeserializeFromStreamAsync(Stream stream) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } return ServiceStack.Text.JsonSerializer.DeserializeFromStreamAsync(stream); } /// /// Deserializes from string. /// /// /// The text. /// ``0. /// text public T DeserializeFromString(string text) { if (string.IsNullOrEmpty(text)) { throw new ArgumentNullException(nameof(text)); } return ServiceStack.Text.JsonSerializer.DeserializeFromString(text); } /// /// Deserializes from stream. /// /// The stream. /// The type. /// System.Object. /// stream public object DeserializeFromStream(Stream stream, Type type) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (type == null) { throw new ArgumentNullException(nameof(type)); } return ServiceStack.Text.JsonSerializer.DeserializeFromStream(type, stream); } public async Task DeserializeFromStreamAsync(Stream stream, Type type) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (type == null) { throw new ArgumentNullException(nameof(type)); } using (var reader = new StreamReader(stream)) { var json = await reader.ReadToEndAsync().ConfigureAwait(false); return ServiceStack.Text.JsonSerializer.DeserializeFromString(json, type); } } private static string SerializeGuid(Guid guid) { if (guid.Equals(Guid.Empty)) { return null; } return guid.ToString("N", CultureInfo.InvariantCulture); } /// /// Deserializes from string. /// /// The json. /// The type. /// System.Object. /// json public object DeserializeFromString(string json, Type type) { if (string.IsNullOrEmpty(json)) { throw new ArgumentNullException(nameof(json)); } if (type == null) { throw new ArgumentNullException(nameof(type)); } return ServiceStack.Text.JsonSerializer.DeserializeFromString(json, type); } /// /// Serializes to string. /// /// The obj. /// System.String. /// obj public string SerializeToString(object obj) { if (obj == null) { throw new ArgumentNullException(nameof(obj)); } return ServiceStack.Text.JsonSerializer.SerializeToString(obj, obj.GetType()); } } }