409 lines
15 KiB
C#
409 lines
15 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Text;
|
|
using GameDevWare.Serialization.MessagePack;
|
|
using GameDevWare.Serialization.Serializers;
|
|
|
|
// ReSharper disable once CheckNamespace
|
|
namespace GameDevWare.Serialization
|
|
{
|
|
public static class Json
|
|
{
|
|
|
|
private static IFormatProvider _DefaultFormat = CultureInfo.InvariantCulture;
|
|
private static Encoding _DefaultEncoding = new UTF8Encoding(false, true);
|
|
private static string[] _DefaultDateTimeFormats;
|
|
|
|
public static string[] DefaultDateTimeFormats
|
|
{
|
|
get { return _DefaultDateTimeFormats; }
|
|
set
|
|
{
|
|
if (value == null) throw new ArgumentNullException("value");
|
|
if (value.Length == 0) throw new ArgumentException();
|
|
|
|
_DefaultDateTimeFormats = value;
|
|
}
|
|
}
|
|
public static IFormatProvider DefaultFormat
|
|
{
|
|
get { return _DefaultFormat; }
|
|
set
|
|
{
|
|
if (value == null) throw new ArgumentNullException("value");
|
|
|
|
_DefaultFormat = value;
|
|
}
|
|
}
|
|
public static Encoding DefaultEncoding
|
|
{
|
|
get { return _DefaultEncoding; }
|
|
set
|
|
{
|
|
if (value == null) throw new ArgumentNullException("value");
|
|
|
|
_DefaultEncoding = value;
|
|
}
|
|
}
|
|
public static List<TypeSerializer> DefaultSerializers { get; private set; }
|
|
|
|
static Json()
|
|
{
|
|
// ReSharper disable StringLiteralTypo
|
|
_DefaultDateTimeFormats = new[]
|
|
{
|
|
"yyyy-MM-ddTHH:mm:ss.fffzzz", // ISO 8601, with timezone
|
|
"yyyy-MM-ddTHH:mm:ss.ffzzz", // ISO 8601, with timezone
|
|
"yyyy-MM-ddTHH:mm:ss.fzzz", // ISO 8601, with timezone
|
|
"yyyy-MM-ddTHH:mm:ssZ", // also ISO 8601, without timezone and without microseconds
|
|
"yyyy-MM-ddTHH:mm:ss.fZ", // also ISO 8601, without timezone
|
|
"yyyy-MM-ddTHH:mm:ss.ffZ", // also ISO 8601, without timezone
|
|
"yyyy-MM-ddTHH:mm:ss.fffZ", // also ISO 8601, without timezone
|
|
"yyyy-MM-ddTHH:mm:ss.ffffZ", // also ISO 8601, without timezone
|
|
"yyyy-MM-ddTHH:mm:ss.fffffZ", // also ISO 8601, without timezone
|
|
"yyyy-MM-ddTHH:mm:ss.ffffffZ", // also ISO 8601, without timezone
|
|
"yyyy-MM-ddTHH:mm:ss.fffffffZ" // also ISO 8601, without timezone
|
|
};
|
|
// ReSharper restore StringLiteralTypo
|
|
|
|
DefaultSerializers = new List<TypeSerializer>
|
|
{
|
|
new BinarySerializer(),
|
|
new DateTimeOffsetSerializer(),
|
|
new DateTimeSerializer(),
|
|
new GuidSerializer(),
|
|
new StreamSerializer(),
|
|
new UriSerializer(),
|
|
new VersionSerializer(),
|
|
new TimeSpanSerializer(),
|
|
new DictionaryEntrySerializer(),
|
|
|
|
#if UNITY_5 || UNITY_4 || UNITY_3_3 || UNITY_3_4 || UNITY_3_5 || UNITY_5_3_OR_NEWER
|
|
new BoundsSerializer(),
|
|
new Matrix4x4Serializer(),
|
|
new QuaternionSerializer(),
|
|
new RectSerializer(),
|
|
new Vector2Serializer(),
|
|
new Vector3Serializer(),
|
|
new Vector4Serializer(),
|
|
#endif
|
|
new PrimitiveSerializer(typeof (bool)),
|
|
new PrimitiveSerializer(typeof (byte)),
|
|
new PrimitiveSerializer(typeof (decimal)),
|
|
new PrimitiveSerializer(typeof (double)),
|
|
new PrimitiveSerializer(typeof (short)),
|
|
new PrimitiveSerializer(typeof (int)),
|
|
new PrimitiveSerializer(typeof (long)),
|
|
new PrimitiveSerializer(typeof (sbyte)),
|
|
new PrimitiveSerializer(typeof (float)),
|
|
new PrimitiveSerializer(typeof (ushort)),
|
|
new PrimitiveSerializer(typeof (uint)),
|
|
new PrimitiveSerializer(typeof (ulong)),
|
|
new PrimitiveSerializer(typeof (string)),
|
|
};
|
|
}
|
|
|
|
public static void Serialize<T>(T objectToSerialize, Stream jsonOutput)
|
|
{
|
|
Serialize(objectToSerialize, jsonOutput, CreateDefaultContext(SerializationOptions.None));
|
|
}
|
|
public static void Serialize<T>(T objectToSerialize, Stream jsonOutput, Encoding encoding)
|
|
{
|
|
Serialize(objectToSerialize, jsonOutput, CreateDefaultContext(SerializationOptions.None, encoding));
|
|
}
|
|
public static void Serialize<T>(T objectToSerialize, Stream jsonOutput, SerializationOptions options)
|
|
{
|
|
Serialize(objectToSerialize, jsonOutput, CreateDefaultContext(options));
|
|
}
|
|
public static void Serialize<T>(T objectToSerialize, Stream jsonOutput, SerializationOptions options, Encoding encoding)
|
|
{
|
|
Serialize(objectToSerialize, jsonOutput, CreateDefaultContext(options, encoding));
|
|
}
|
|
public static void Serialize<T>(T objectToSerialize, Stream jsonOutput, SerializationContext context)
|
|
{
|
|
if (jsonOutput == null) throw new ArgumentNullException("jsonOutput");
|
|
if (context == null) throw new ArgumentNullException("context");
|
|
if (!jsonOutput.CanWrite) throw JsonSerializationException.StreamIsNotWriteable();
|
|
|
|
|
|
if (objectToSerialize == null)
|
|
{
|
|
var bytes = context.Encoding.GetBytes("null");
|
|
jsonOutput.Write(bytes, 0, bytes.Length);
|
|
return;
|
|
}
|
|
|
|
var writer = new JsonStreamWriter(jsonOutput, context);
|
|
writer.WriteValue(objectToSerialize, typeof(T));
|
|
writer.Flush();
|
|
}
|
|
|
|
public static void Serialize<T>(T objectToSerialize, TextWriter textWriter)
|
|
{
|
|
Serialize(objectToSerialize, textWriter, CreateDefaultContext(SerializationOptions.None));
|
|
}
|
|
public static void Serialize<T>(T objectToSerialize, TextWriter textWriter, SerializationOptions options)
|
|
{
|
|
Serialize(objectToSerialize, textWriter, CreateDefaultContext(options));
|
|
}
|
|
public static void Serialize<T>(T objectToSerialize, TextWriter textWriter, SerializationContext context)
|
|
{
|
|
if (textWriter == null) throw new ArgumentNullException("textWriter");
|
|
if (context == null) throw new ArgumentNullException("context");
|
|
|
|
if (objectToSerialize == null)
|
|
{
|
|
textWriter.Write("null");
|
|
textWriter.Flush();
|
|
return;
|
|
}
|
|
|
|
|
|
var writer = new JsonTextWriter(textWriter, context);
|
|
writer.WriteValue(objectToSerialize, typeof(T));
|
|
writer.Flush();
|
|
}
|
|
|
|
public static void Serialize<T>(T objectToSerialize, IJsonWriter writer, SerializationContext context)
|
|
{
|
|
if (writer == null) throw new ArgumentNullException("writer");
|
|
if (context == null) throw new ArgumentNullException("context");
|
|
|
|
if (objectToSerialize == null)
|
|
{
|
|
writer.WriteNull();
|
|
writer.Flush();
|
|
return;
|
|
}
|
|
|
|
writer.WriteValue(objectToSerialize, typeof(T));
|
|
writer.Flush();
|
|
}
|
|
|
|
public static string SerializeToString<T>(T objectToSerialize)
|
|
{
|
|
return SerializeToString(objectToSerialize, CreateDefaultContext(SerializationOptions.None));
|
|
}
|
|
public static string SerializeToString<T>(T objectToSerialize, SerializationOptions options)
|
|
{
|
|
return SerializeToString(objectToSerialize, CreateDefaultContext(options));
|
|
}
|
|
public static string SerializeToString<T>(T objectToSerialize, SerializationContext context)
|
|
{
|
|
if (context == null) throw new ArgumentNullException("context");
|
|
|
|
if (objectToSerialize == null)
|
|
return "null";
|
|
|
|
var writer = new JsonStringBuilderWriter(new StringBuilder(), context);
|
|
writer.WriteValue(objectToSerialize, typeof(T));
|
|
writer.Flush();
|
|
|
|
return writer.ToString();
|
|
}
|
|
|
|
public static object Deserialize(Type objectType, byte[] jsonBytes, int offset, int length)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize(objectType, new MemoryStream(jsonBytes, offset, length));
|
|
}
|
|
public static object Deserialize(Type objectType, byte[] jsonBytes, int offset, int length, Encoding encoding)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize(objectType, new MemoryStream(jsonBytes, offset, length), encoding);
|
|
}
|
|
public static object Deserialize(Type objectType, byte[] jsonBytes, int offset, int length, SerializationOptions options)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize(objectType, new MemoryStream(jsonBytes, offset, length), options);
|
|
}
|
|
public static object Deserialize(Type objectType, byte[] jsonBytes, int offset, int length, SerializationOptions options, Encoding encoding)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize(objectType, new MemoryStream(jsonBytes, offset, length), options, encoding);
|
|
}
|
|
public static object Deserialize(Type objectType, byte[] jsonBytes, int offset, int length, SerializationContext context)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize(objectType, new MemoryStream(jsonBytes, offset, length), context);
|
|
}
|
|
|
|
public static object Deserialize(Type objectType, Stream jsonStream)
|
|
{
|
|
return Deserialize(objectType, jsonStream, CreateDefaultContext(SerializationOptions.None));
|
|
}
|
|
public static object Deserialize(Type objectType, Stream jsonStream, Encoding encoding)
|
|
{
|
|
return Deserialize(objectType, jsonStream, CreateDefaultContext(SerializationOptions.None, encoding));
|
|
}
|
|
public static object Deserialize(Type objectType, Stream jsonStream, SerializationOptions options)
|
|
{
|
|
return Deserialize(objectType, jsonStream, CreateDefaultContext(options));
|
|
}
|
|
public static object Deserialize(Type objectType, Stream jsonStream, SerializationOptions options, Encoding encoding)
|
|
{
|
|
return Deserialize(objectType, jsonStream, CreateDefaultContext(options, encoding));
|
|
}
|
|
public static object Deserialize(Type objectType, Stream jsonStream, SerializationContext context)
|
|
{
|
|
if (objectType == null) throw new ArgumentNullException("objectType");
|
|
if (jsonStream == null) throw new ArgumentNullException("jsonStream");
|
|
if (context == null) throw new ArgumentNullException("context");
|
|
if (!jsonStream.CanRead) throw JsonSerializationException.StreamIsNotReadable();
|
|
|
|
var reader = new JsonStreamReader(jsonStream, context);
|
|
return reader.ReadValue(objectType, false);
|
|
}
|
|
|
|
public static object Deserialize(Type objectType, TextReader textReader)
|
|
{
|
|
return Deserialize(objectType, textReader, CreateDefaultContext(SerializationOptions.None));
|
|
}
|
|
public static object Deserialize(Type objectType, TextReader textReader, SerializationOptions options)
|
|
{
|
|
return Deserialize(objectType, textReader, CreateDefaultContext(options));
|
|
}
|
|
public static object Deserialize(Type objectType, TextReader textReader, SerializationContext context)
|
|
{
|
|
if (objectType == null) throw new ArgumentNullException("objectType");
|
|
if (textReader == null) throw new ArgumentNullException("textReader");
|
|
if (context == null) throw new ArgumentNullException("context");
|
|
|
|
var reader = new JsonTextReader(textReader, context);
|
|
return reader.ReadValue(objectType, false);
|
|
}
|
|
|
|
public static object Deserialize(Type objectType, string jsonString)
|
|
{
|
|
return Deserialize(objectType, jsonString, CreateDefaultContext(SerializationOptions.None));
|
|
}
|
|
public static object Deserialize(Type objectType, string jsonString, SerializationOptions options)
|
|
{
|
|
return Deserialize(objectType, jsonString, CreateDefaultContext(options));
|
|
}
|
|
public static object Deserialize(Type objectType, string jsonString, SerializationContext context)
|
|
{
|
|
if (objectType == null) throw new ArgumentNullException("objectType");
|
|
if (jsonString == null) throw new ArgumentNullException("jsonString");
|
|
if (context == null) throw new ArgumentNullException("context");
|
|
|
|
|
|
var reader = new JsonStringReader(jsonString, context);
|
|
return reader.ReadValue(objectType, false);
|
|
}
|
|
|
|
public static object Deserialize(Type objectType, IJsonReader reader)
|
|
{
|
|
if (objectType == null) throw new ArgumentNullException("objectType");
|
|
if (reader == null) throw new ArgumentNullException("reader");
|
|
|
|
return reader.ReadValue(objectType, false);
|
|
}
|
|
|
|
|
|
public static T Deserialize<T>(byte[] jsonBytes, int offset, int length)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize<T>(new MemoryStream(jsonBytes, offset, length));
|
|
}
|
|
public static T Deserialize<T>(byte[] jsonBytes, int offset, int length, Encoding encoding)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize<T>(new MemoryStream(jsonBytes, offset, length), encoding);
|
|
}
|
|
public static T Deserialize<T>(byte[] jsonBytes, int offset, int length, SerializationOptions options)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize<T>(new MemoryStream(jsonBytes, offset, length), options);
|
|
}
|
|
public static T Deserialize<T>(byte[] jsonBytes, int offset, int length, SerializationOptions options, Encoding encoding)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize<T>(new MemoryStream(jsonBytes, offset, length), options, encoding);
|
|
}
|
|
public static T Deserialize<T>(byte[] jsonBytes, int offset, int length, SerializationContext context)
|
|
{
|
|
if (jsonBytes == null) throw new ArgumentNullException("jsonBytes");
|
|
|
|
return Deserialize<T>( new MemoryStream(jsonBytes, offset, length), context);
|
|
}
|
|
|
|
|
|
public static T Deserialize<T>(Stream jsonStream)
|
|
{
|
|
return (T)Deserialize(typeof(T), jsonStream, CreateDefaultContext(SerializationOptions.None));
|
|
}
|
|
public static T Deserialize<T>(Stream jsonStream, Encoding encoding)
|
|
{
|
|
return (T)Deserialize(typeof(T), jsonStream, CreateDefaultContext(SerializationOptions.None, encoding));
|
|
}
|
|
public static T Deserialize<T>(Stream jsonStream, SerializationOptions options)
|
|
{
|
|
return (T)Deserialize(typeof(T), jsonStream, CreateDefaultContext(options));
|
|
}
|
|
public static T Deserialize<T>(Stream jsonStream, SerializationOptions options, Encoding encoding)
|
|
{
|
|
return (T)Deserialize(typeof(T), jsonStream, CreateDefaultContext(options, encoding));
|
|
}
|
|
public static T Deserialize<T>(Stream jsonStream, SerializationContext context)
|
|
{
|
|
return (T)Deserialize(typeof(T), jsonStream, context);
|
|
|
|
}
|
|
|
|
public static T Deserialize<T>(TextReader textReader)
|
|
{
|
|
return (T)Deserialize(typeof(T), textReader, CreateDefaultContext(SerializationOptions.None));
|
|
}
|
|
public static T Deserialize<T>(TextReader textReader, SerializationOptions options)
|
|
{
|
|
return (T)Deserialize(typeof(T), textReader, CreateDefaultContext(options));
|
|
}
|
|
public static T Deserialize<T>(TextReader textReader, SerializationContext context)
|
|
{
|
|
return (T)Deserialize(typeof(T), textReader, context);
|
|
}
|
|
|
|
public static T Deserialize<T>(string jsonString)
|
|
{
|
|
return (T)Deserialize(typeof(T), jsonString, CreateDefaultContext(SerializationOptions.None));
|
|
}
|
|
public static T Deserialize<T>(string jsonString, SerializationOptions options)
|
|
{
|
|
return (T)Deserialize(typeof(T), jsonString, CreateDefaultContext(options));
|
|
}
|
|
public static T Deserialize<T>(string jsonString, SerializationContext context)
|
|
{
|
|
return (T)Deserialize(typeof(T), jsonString, context);
|
|
}
|
|
|
|
public static T Deserialize<T>(IJsonReader reader)
|
|
{
|
|
if (reader == null) throw new ArgumentNullException("reader");
|
|
|
|
var serializer = reader.Context.GetSerializerForType(typeof(T));
|
|
return (T)serializer.Deserialize(reader);
|
|
}
|
|
|
|
private static SerializationContext CreateDefaultContext(SerializationOptions options, Encoding encoding = null)
|
|
{
|
|
return new SerializationContext
|
|
{
|
|
Encoding = encoding ?? DefaultEncoding,
|
|
Options = options
|
|
};
|
|
}
|
|
}
|
|
}
|