diff options
Diffstat (limited to 'MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs')
| -rw-r--r-- | MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs b/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs new file mode 100644 index 000000000..f83b31322 --- /dev/null +++ b/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs @@ -0,0 +1,160 @@ +using MediaBrowser.Common.Mef; +using ProtoBuf; +using ProtoBuf.Meta; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; + +namespace MediaBrowser.Common.Serialization +{ + /// <summary> + /// Creates a compiled protobuf serializer based on a set of assemblies + /// </summary> + public class DynamicProtobufSerializer + { + /// <summary> + /// Gets or sets the type model. + /// </summary> + /// <value>The type model.</value> + public TypeModel TypeModel { get; set; } + + /// <summary> + /// Serializes to stream. + /// </summary> + /// <param name="obj">The obj.</param> + /// <param name="stream">The stream.</param> + /// <exception cref="System.ArgumentNullException">obj</exception> + public void SerializeToStream(object obj, Stream stream) + { + if (obj == null) + { + throw new ArgumentNullException("obj"); + } + if (stream == null) + { + throw new ArgumentNullException("stream"); + } + + TypeModel.Serialize(stream, obj); + } + + /// <summary> + /// Deserializes from stream. + /// </summary> + /// <param name="stream">The stream.</param> + /// <param name="type">The type.</param> + /// <returns>System.Object.</returns> + /// <exception cref="System.ArgumentNullException">stream</exception> + public object DeserializeFromStream(Stream stream, Type type) + { + if (stream == null) + { + throw new ArgumentNullException("stream"); + } + + return TypeModel.Deserialize(stream, null, type); + } + + /// <summary> + /// Deserializes from stream. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="stream">The stream.</param> + /// <returns>``0.</returns> + public T DeserializeFromStream<T>(Stream stream) + where T : class + { + return DeserializeFromStream(stream, typeof(T)) as T; + } + + /// <summary> + /// Serializes to file. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="obj">The obj.</param> + /// <param name="file">The file.</param> + /// <exception cref="System.ArgumentNullException">file</exception> + public void SerializeToFile<T>(T obj, string file) + { + if (string.IsNullOrEmpty(file)) + { + throw new ArgumentNullException("file"); + } + + using (Stream stream = File.Open(file, FileMode.Create)) + { + SerializeToStream(obj, stream); + } + } + + /// <summary> + /// Deserializes from file. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="file">The file.</param> + /// <returns>``0.</returns> + /// <exception cref="System.ArgumentNullException">file</exception> + public T DeserializeFromFile<T>(string file) + where T : class + { + if (string.IsNullOrEmpty(file)) + { + throw new ArgumentNullException("file"); + } + + using (Stream stream = File.OpenRead(file)) + { + return DeserializeFromStream<T>(stream); + } + } + + /// <summary> + /// Serializes to bytes. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="obj">The obj.</param> + /// <returns>System.Byte[][].</returns> + /// <exception cref="System.ArgumentNullException">obj</exception> + public byte[] SerializeToBytes<T>(T obj) + where T : class + { + if (obj == null) + { + throw new ArgumentNullException("obj"); + } + + using (var stream = new MemoryStream()) + { + SerializeToStream(obj, stream); + return stream.ToArray(); + } + } + + /// <summary> + /// Creates the specified assemblies. + /// </summary> + /// <param name="assemblies">The assemblies.</param> + /// <returns>DynamicProtobufSerializer.</returns> + /// <exception cref="System.ArgumentNullException">assemblies</exception> + public static DynamicProtobufSerializer Create(IEnumerable<Assembly> assemblies) + { + if (assemblies == null) + { + throw new ArgumentNullException("assemblies"); + } + + var model = TypeModel.Create(); + var attributeType = typeof(ProtoContractAttribute); + + // Find all ProtoContracts in the current assembly + foreach (var type in assemblies.SelectMany(a => MefUtils.GetTypes(a).Where(t => Attribute.IsDefined(t, attributeType)))) + { + model.Add(type, true); + } + + return new DynamicProtobufSerializer { TypeModel = model.Compile() }; + } + } +} |
