using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.Serialization; using MediaBrowser.Model.IO; using MediaBrowser.Model.Serialization; using Microsoft.Extensions.Logging; namespace Emby.Server.Implementations.Serialization { /// /// Provides a wrapper around third party xml serialization. /// public class MyXmlSerializer : IXmlSerializer { private readonly IFileSystem _fileSystem; private readonly ILogger _logger; public MyXmlSerializer(IFileSystem fileSystem, ILogger logger) { _fileSystem = fileSystem; _logger = logger; } // Need to cache these // http://dotnetcodebox.blogspot.com/2013/01/xmlserializer-class-may-result-in.html private readonly Dictionary _serializers = new Dictionary(); private XmlSerializer GetSerializer(Type type) { var key = type.FullName; lock (_serializers) { if (!_serializers.TryGetValue(key, out var serializer)) { serializer = new XmlSerializer(type); _serializers[key] = serializer; } return serializer; } } /// /// Serializes to writer. /// /// The obj. /// The writer. private void SerializeToWriter(object obj, XmlWriter writer) { var netSerializer = GetSerializer(obj.GetType()); netSerializer.Serialize(writer, obj); } /// /// Deserializes from stream. /// /// The type. /// The stream. /// System.Object. public object DeserializeFromStream(Type type, Stream stream) { using (var reader = XmlReader.Create(stream)) { var netSerializer = GetSerializer(type); return netSerializer.Deserialize(reader); } } /// /// Serializes to stream. /// /// The obj. /// The stream. public void SerializeToStream(object obj, Stream stream) { using (var writer = new XmlTextWriter(stream, null)) { writer.Formatting = Formatting.Indented; SerializeToWriter(obj, writer); } } /// /// Serializes to file. /// /// The obj. /// The file. public void SerializeToFile(object obj, string file) { _logger.LogDebug("Serializing to file {0}", file); using (var stream = new FileStream(file, FileMode.Create)) { SerializeToStream(obj, stream); } } /// /// Deserializes from file. /// /// The type. /// The file. /// System.Object. public object DeserializeFromFile(Type type, string file) { _logger.LogDebug("Deserializing file {0}", file); using (var stream = _fileSystem.OpenRead(file)) { return DeserializeFromStream(type, stream); } } /// /// Deserializes from bytes. /// /// The type. /// The buffer. /// System.Object. public object DeserializeFromBytes(Type type, byte[] buffer) { using (var stream = new MemoryStream(buffer)) { return DeserializeFromStream(type, stream); } } } }