Skip to content

fixed #437 + updated nino #441

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Binary file not shown.
121 changes: 69 additions & 52 deletions UnityProject/Assets/Dependencies/Nino/Serialization/CodeGenerator.cs

Large diffs are not rendered by default.

157 changes: 107 additions & 50 deletions UnityProject/Assets/Dependencies/Nino/Serialization/Deserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,56 @@ public static T Deserialize<T>(ArraySegment<byte> data, Encoding encoding = null
return ret;
}

return (T)Deserialize(type, null, data, encoding ?? DefaultEncoding, reader, true, true, true);
return (T)Deserialize(type, null, data, encoding ?? DefaultEncoding, reader, option, true, true, true);
}

/// <summary>
/// Deserialize a NinoSerialize object
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <param name="encoding"></param>
/// <param name="reader"></param>
/// <param name="option"></param>
/// <param name="returnDispose"></param>
/// <param name="skipBasicCheck"></param>
/// <param name="skipCodeGenCheck"></param>
/// <param name="skipGenericCheck"></param>
/// <param name="skipEnumCheck"></param>
/// <returns></returns>
internal static T Deserialize<T>(Span<byte> data,Encoding encoding, Reader reader,
CompressOption option = CompressOption.Zlib, bool returnDispose = true, bool skipBasicCheck = false,
bool skipCodeGenCheck = false, bool skipGenericCheck = false, bool skipEnumCheck = false)
{
Type type = typeof(T);

//basic type
if (!skipBasicCheck && WrapperManifest.TryGetWrapper(type, out var wrapper))
{
var ret = ((NinoWrapperBase<T>)wrapper).Deserialize(reader);
if (returnDispose)
{
ObjectPool<Reader>.Return(reader);
}
return ret;
}

//code generated type
if (!skipCodeGenCheck && TypeModel.TryGetWrapper(type, out wrapper))
{
//add wrapper
WrapperManifest.AddWrapper(type, wrapper);
//start Deserialize
var ret = ((NinoWrapperBase<T>)wrapper).Deserialize(reader);
if (returnDispose)
{
ObjectPool<Reader>.Return(reader);
}
return ret;
}

return (T)Deserialize(type, null, data, encoding ?? DefaultEncoding, reader, option, returnDispose,
skipBasicCheck, skipCodeGenCheck, skipGenericCheck, skipEnumCheck);
}

/// <summary>
Expand Down Expand Up @@ -156,7 +205,7 @@ public static object Deserialize(Type type, byte[] data, Encoding encoding = nul
return ret;
}

return Deserialize(type, null, data, encoding ?? DefaultEncoding, reader, true, true, true);
return Deserialize(type, null, data, encoding ?? DefaultEncoding, reader, option, true, true, true);
}

/// <summary>
Expand Down Expand Up @@ -193,7 +242,7 @@ public static object Deserialize(Type type, ArraySegment<byte> data, Encoding en
return ret;
}

return Deserialize(type, null, data, encoding ?? DefaultEncoding, reader, true, true, true);
return Deserialize(type, null, data, encoding ?? DefaultEncoding, reader, option, true, true, true);
}

/// <summary>
Expand Down Expand Up @@ -229,7 +278,7 @@ internal static object Deserialize(Type type, object val, byte[] data, Encoding
TypeModel.IsNonCompressibleType(type) ? CompressOption.NoCompression : option);
}

return Deserialize(type, val, (Span<byte>)data, encoding, reader, returnDispose, skipBasicCheck,
return Deserialize(type, val, (Span<byte>)data, encoding, reader,option, returnDispose, skipBasicCheck,
skipCodeGenCheck, skipGenericCheck, skipEnumCheck);
}

Expand Down Expand Up @@ -266,7 +315,7 @@ internal static object Deserialize(Type type, object val, ArraySegment<byte> dat
TypeModel.IsNonCompressibleType(type) ? CompressOption.NoCompression : option);
}

return Deserialize(type, val, data, encoding, reader, returnDispose, skipBasicCheck,
return Deserialize(type, val, (Span<byte>)data, encoding, reader, option, returnDispose, skipBasicCheck,
skipCodeGenCheck, skipGenericCheck, skipEnumCheck);
}

Expand All @@ -278,6 +327,7 @@ internal static object Deserialize(Type type, object val, ArraySegment<byte> dat
/// <param name="data"></param>
/// <param name="encoding"></param>
/// <param name="reader"></param>
/// <param name="option"></param>
/// <param name="returnDispose"></param>
/// <param name="skipBasicCheck"></param>
/// <param name="skipCodeGenCheck"></param>
Expand All @@ -288,13 +338,53 @@ internal static object Deserialize(Type type, object val, ArraySegment<byte> dat
/// <exception cref="NullReferenceException"></exception>
// ReSharper disable CognitiveComplexity
internal static object Deserialize(Type type, object val, Span<byte> data, Encoding encoding, Reader reader,
bool returnDispose = true, bool skipBasicCheck = false,
CompressOption option = CompressOption.Zlib, bool returnDispose = true, bool skipBasicCheck = false,
bool skipCodeGenCheck = false, bool skipGenericCheck = false, bool skipEnumCheck = false)
// ReSharper restore CognitiveComplexity
{
//prevent null encoding
encoding = encoding ?? DefaultEncoding;

//array
if (!skipGenericCheck && type.IsArray)
{
var ret = reader.ReadArray(type);
if (returnDispose)
{
ObjectPool<Reader>.Return(reader);
}

return ret;
}

//list, dict
if (!skipGenericCheck && type.IsGenericType)
{
var genericDefType = type.GetGenericTypeDefinition();
//不是list和dict就再见了
if (genericDefType == ConstMgr.ListDefType)
{
var ret = reader.ReadList(type);
if (returnDispose)
{
ObjectPool<Reader>.Return(reader);
}

return ret;
}

if (genericDefType == ConstMgr.DictDefType)
{
var ret = reader.ReadDictionary(type);
if (returnDispose)
{
ObjectPool<Reader>.Return(reader);
}

return ret;
}
}

#if ILRuntime
type = type.ResolveRealType();
#endif
Expand All @@ -315,11 +405,16 @@ internal static object Deserialize(Type type, object val, Span<byte> data, Encod
if (!skipEnumCheck && TypeModel.IsEnum(type))
{

var ret = Deserialize(Enum.GetUnderlyingType(type), null, data, encoding, reader, returnDispose);
var underlyingType = Enum.GetUnderlyingType(type);
var ret = Deserialize(underlyingType, null, data, encoding, reader, option, returnDispose);
#if ILRuntime
if (type is ILRuntime.Reflection.ILRuntimeType)
{
return ret;
if (underlyingType == ConstMgr.LongType
|| underlyingType == ConstMgr.UIntType
|| underlyingType == ConstMgr.ULongType)
return Convert.ChangeType(ret, ConstMgr.LongType);
return Convert.ChangeType(ret, ConstMgr.IntType);
}
#endif
ret = Enum.ToObject(type, ret);
Expand All @@ -341,46 +436,6 @@ internal static object Deserialize(Type type, object val, Span<byte> data, Encod
return ret;
}

//array
if (!skipGenericCheck && type.IsArray)
{
var ret = reader.ReadArray(type);
if (returnDispose)
{
ObjectPool<Reader>.Return(reader);
}

return ret;
}

//list, dict
if (!skipGenericCheck && type.IsGenericType)
{
var genericDefType = type.GetGenericTypeDefinition();
//不是list和dict就再见了
if (genericDefType == ConstMgr.ListDefType)
{
var ret = reader.ReadList(type);
if (returnDispose)
{
ObjectPool<Reader>.Return(reader);
}

return ret;
}

if (genericDefType == ConstMgr.DictDefType)
{
var ret = reader.ReadDictionary(type);
if (returnDispose)
{
ObjectPool<Reader>.Return(reader);
}

return ret;
}
}

//create type
if (val == null || val == ConstMgr.Null)
{
Expand Down Expand Up @@ -422,7 +477,8 @@ void Read()
{
var key = reader.ReadString();
var typeFullName = reader.ReadString();
var value = reader.ReadCommonVal(Type.GetType(typeFullName));
var value = Deserialize(Type.GetType(typeFullName), ConstMgr.Null, ConstMgr.Null, encoding,
reader, option, false);
values.Add(key, value);
}

Expand Down Expand Up @@ -487,7 +543,8 @@ void Read()
//try code gen, if no code gen then reflection

//read basic values
var ret = reader.ReadCommonVal(type);
var ret = Deserialize(type, ConstMgr.Null, ConstMgr.Null, encoding,
reader, option, false);
//type check
#if !ILRuntime
if (TypeModel.IsEnum(type))
Expand Down
Loading