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)); } } }