using System;
using System.Buffers;
using MemoryPack;
namespace Fantasy.Serialize
{
///
/// MemoryPack帮助类
///
public sealed class MemoryPackHelper : ISerialize
{
///
/// 序列化器的名字
///
public string SerializeName { get; } = "MemoryPack";
///
/// 反序列化
///
///
///
///
public T Deserialize(byte[] bytes)
{
var @object = MemoryPackSerializer.Deserialize(bytes);
if (@object is ASerialize aSerialize)
{
aSerialize.AfterDeserialization();
}
return @object;
}
///
/// 反序列化
///
///
///
///
public T Deserialize(MemoryStreamBuffer buffer)
{
var @object = MemoryPackSerializer.Deserialize(buffer.GetSpan());
if (@object is ASerialize aSerialize)
{
aSerialize.AfterDeserialization();
}
return @object;
}
///
/// 反序列化
///
///
///
///
public object Deserialize(Type type, byte[] bytes)
{
var @object = MemoryPackSerializer.Deserialize(type,bytes);
if (@object is ASerialize aSerialize)
{
aSerialize.AfterDeserialization();
}
return @object;
}
///
/// 反序列化
///
///
///
///
public object Deserialize(Type type, MemoryStreamBuffer buffer)
{
var @object = MemoryPackSerializer.Deserialize(type, buffer.GetSpan());
if (@object is ASerialize aSerialize)
{
aSerialize.AfterDeserialization();
}
return @object;
}
///
/// 反序列化
///
///
///
///
///
///
public T Deserialize(byte[] bytes, int index, int count)
{
var @object = MemoryPackSerializer.Deserialize(new ReadOnlySpan(bytes, index, count));
if (@object is ASerialize aSerialize)
{
aSerialize.AfterDeserialization();
}
return @object;
}
///
/// 反序列化
///
///
///
///
///
///
public object Deserialize(Type type, byte[] bytes, int index, int count)
{
var @object = MemoryPackSerializer.Deserialize(type, new ReadOnlySpan(bytes, index, count));
if (@object is ASerialize aSerialize)
{
aSerialize.AfterDeserialization();
}
return @object;
}
///
/// 序列化
///
///
///
///
public void Serialize(T @object, IBufferWriter buffer)
{
if (@object is ASerialize aSerialize)
{
aSerialize.BeginInit();
}
MemoryPackSerializer.Serialize>(buffer, @object);
}
///
/// 序列化
///
///
///
public void Serialize(object @object, IBufferWriter buffer)
{
if (@object is ASerialize aSerialize)
{
aSerialize.BeginInit();
}
MemoryPackSerializer.Serialize(@object.GetType(), buffer, @object);
}
///
/// 序列化
///
///
///
///
public void Serialize(Type type, object @object, IBufferWriter buffer)
{
if (@object is ASerialize aSerialize)
{
aSerialize.BeginInit();
}
MemoryPackSerializer.Serialize(type, buffer, @object);
}
///
/// 序列化
///
///
///
public byte[] Serialize(object @object)
{
if (@object is ASerialize aSerialize)
{
aSerialize.BeginInit();
}
return MemoryPackSerializer.Serialize(@object.GetType(), @object);
}
///
/// 序列化
///
///
///
///
public byte[] Serialize(T @object)
{
if (@object is ASerialize aSerialize)
{
aSerialize.BeginInit();
}
return MemoryPackSerializer.Serialize(@object);
}
///
/// 克隆
///
///
///
///
public T Clone(T t)
{
return Deserialize(Serialize(t));
}
}
}