132 lines
5.2 KiB
C#
132 lines
5.2 KiB
C#
|
|
using System;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.IO;
|
||
|
|
using System.Text;
|
||
|
|
using GameDevWare.Serialization.MessagePack;
|
||
|
|
using GameDevWare.Serialization.Serializers;
|
||
|
|
|
||
|
|
// ReSharper disable once CheckNamespace
|
||
|
|
namespace GameDevWare.Serialization
|
||
|
|
{
|
||
|
|
public static class MsgPack
|
||
|
|
{
|
||
|
|
public static string[] DefaultDateTimeFormats { get { return Json.DefaultDateTimeFormats; } set { Json.DefaultDateTimeFormats = value; } }
|
||
|
|
public static IFormatProvider DefaultFormat { get { return Json.DefaultFormat; } set { Json.DefaultFormat = value; } }
|
||
|
|
public static Encoding DefaultEncoding { get { return Json.DefaultEncoding; } set { Json.DefaultEncoding = value; } }
|
||
|
|
public static List<TypeSerializer> DefaultSerializers { get { return Json.DefaultSerializers; } }
|
||
|
|
public static MessagePackExtensionTypeHandler ExtensionTypeHandler { get; private set; }
|
||
|
|
|
||
|
|
static MsgPack()
|
||
|
|
{
|
||
|
|
ExtensionTypeHandler = new DefaultMessagePackExtensionTypeHandler(EndianBitConverter.Big);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void Serialize<T>(T objectToSerialize, Stream msgPackOutput)
|
||
|
|
{
|
||
|
|
Serialize(objectToSerialize, msgPackOutput, CreateDefaultContext(SerializationOptions.None));
|
||
|
|
}
|
||
|
|
public static void Serialize<T>(T objectToSerialize, Stream msgPackOutput, SerializationOptions options)
|
||
|
|
{
|
||
|
|
Serialize(objectToSerialize, msgPackOutput, CreateDefaultContext(options));
|
||
|
|
}
|
||
|
|
public static void Serialize<T>(T objectToSerialize, Stream msgPackOutput, SerializationContext context)
|
||
|
|
{
|
||
|
|
if (msgPackOutput == null) throw new ArgumentNullException("msgPackOutput");
|
||
|
|
if (context == null) throw new ArgumentNullException("context");
|
||
|
|
|
||
|
|
var writer = new MsgPackWriter(msgPackOutput, context);
|
||
|
|
if (objectToSerialize == null)
|
||
|
|
{
|
||
|
|
writer.WriteNull();
|
||
|
|
writer.Flush();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
writer.WriteValue(objectToSerialize, typeof(T));
|
||
|
|
writer.Flush();
|
||
|
|
}
|
||
|
|
|
||
|
|
public static object Deserialize(Type objectType, byte[] msgPackInput, int offset, int length)
|
||
|
|
{
|
||
|
|
if (msgPackInput == null) throw new ArgumentNullException("msgPackInput");
|
||
|
|
|
||
|
|
return Deserialize(objectType, new MemoryStream(msgPackInput, offset, length));
|
||
|
|
}
|
||
|
|
public static object Deserialize(Type objectType, byte[] msgPackInput, int offset, int length, SerializationOptions options)
|
||
|
|
{
|
||
|
|
if (msgPackInput == null) throw new ArgumentNullException("msgPackInput");
|
||
|
|
|
||
|
|
return Deserialize(objectType, new MemoryStream(msgPackInput, offset, length), options);
|
||
|
|
}
|
||
|
|
public static object Deserialize(Type objectType, byte[] msgPackInput, int offset, int length, SerializationContext context)
|
||
|
|
{
|
||
|
|
if (msgPackInput == null) throw new ArgumentNullException("msgPackInput");
|
||
|
|
|
||
|
|
return Deserialize(objectType, new MemoryStream(msgPackInput, offset, length), context);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static object Deserialize(Type objectType, Stream msgPackInput)
|
||
|
|
{
|
||
|
|
return Deserialize(objectType, msgPackInput, CreateDefaultContext(SerializationOptions.None));
|
||
|
|
}
|
||
|
|
public static object Deserialize(Type objectType, Stream msgPackInput, SerializationOptions options)
|
||
|
|
{
|
||
|
|
return Deserialize(objectType, msgPackInput, CreateDefaultContext(options));
|
||
|
|
}
|
||
|
|
public static object Deserialize(Type objectType, Stream msgPackInput, SerializationContext context)
|
||
|
|
{
|
||
|
|
if (objectType == null) throw new ArgumentNullException("objectType");
|
||
|
|
if (context == null) throw new ArgumentNullException("context");
|
||
|
|
if (msgPackInput == null) throw new ArgumentNullException("msgPackInput");
|
||
|
|
if (!msgPackInput.CanRead) throw JsonSerializationException.StreamIsNotReadable();
|
||
|
|
|
||
|
|
var reader = new MsgPackReader(msgPackInput, context);
|
||
|
|
return reader.ReadValue(objectType, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static T Deserialize<T>(byte[] msgPackInput, int offset, int length)
|
||
|
|
{
|
||
|
|
if (msgPackInput == null) throw new ArgumentNullException("msgPackInput");
|
||
|
|
|
||
|
|
return Deserialize<T>(new MemoryStream(msgPackInput, offset, length));
|
||
|
|
}
|
||
|
|
public static T Deserialize<T>(byte[] msgPackInput, int offset, int length, SerializationOptions options)
|
||
|
|
{
|
||
|
|
if (msgPackInput == null) throw new ArgumentNullException("msgPackInput");
|
||
|
|
|
||
|
|
return Deserialize<T>(new MemoryStream(msgPackInput, offset, length), options);
|
||
|
|
}
|
||
|
|
public static T Deserialize<T>(byte[] msgPackInput, int offset, int length, SerializationContext context)
|
||
|
|
{
|
||
|
|
if (msgPackInput == null) throw new ArgumentNullException("msgPackInput");
|
||
|
|
|
||
|
|
return Deserialize<T>(new MemoryStream(msgPackInput, offset, length), context);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static T Deserialize<T>(Stream msgPackInput)
|
||
|
|
{
|
||
|
|
return Deserialize<T>(msgPackInput, CreateDefaultContext(SerializationOptions.None));
|
||
|
|
}
|
||
|
|
public static T Deserialize<T>(Stream msgPackInput, SerializationOptions options)
|
||
|
|
{
|
||
|
|
return Deserialize<T>(msgPackInput, CreateDefaultContext(options));
|
||
|
|
}
|
||
|
|
public static T Deserialize<T>(Stream msgPackInput, SerializationContext context)
|
||
|
|
{
|
||
|
|
if (context == null) throw new ArgumentNullException("context");
|
||
|
|
if (msgPackInput == null) throw new ArgumentNullException("msgPackInput");
|
||
|
|
if (!msgPackInput.CanRead) throw JsonSerializationException.StreamIsNotReadable();
|
||
|
|
|
||
|
|
return (T)Deserialize(typeof(T), msgPackInput, context);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static SerializationContext CreateDefaultContext(SerializationOptions options)
|
||
|
|
{
|
||
|
|
return new SerializationContext
|
||
|
|
{
|
||
|
|
Options = options,
|
||
|
|
EnumSerializerFactory = (enumType) => new EnumNumberSerializer(enumType)
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|