using System; using System.ComponentModel; using System.IO; using ProtoBuf.Meta; using Unity.Mathematics; namespace ET { public static class ProtobufHelper { public static void Init() { } static ProtobufHelper() { RuntimeTypeModel.Default.Add(typeof(float2), false).Add("x", "y"); RuntimeTypeModel.Default.Add(typeof(float3), false).Add("x", "y", "z"); RuntimeTypeModel.Default.Add(typeof(float4), false).Add("x", "y", "z", "w"); RuntimeTypeModel.Default.Add(typeof(quaternion), false).Add("value"); } public static object Deserialize(Type type, byte[] bytes, int index, int count) { using MemoryStream stream = new MemoryStream(bytes, index, count); object o = ProtoBuf.Serializer.Deserialize(type, stream); if (o is ISupportInitialize supportInitialize) { supportInitialize.EndInit(); } return o; } public static byte[] Serialize(object message) { using MemoryStream stream = new MemoryStream(); ProtoBuf.Serializer.Serialize(stream, message); return stream.ToArray(); } public static void Serialize(object message, Stream stream) { ProtoBuf.Serializer.Serialize(stream, message); } public static object Deserialize(Type type, Stream stream) { try { object o = ProtoBuf.Serializer.Deserialize(type, stream); if (o is ISupportInitialize supportInitialize) { supportInitialize.EndInit(); } return o; } catch (Exception) { Log.Error($"协议数据反序列化时出错了,通常原因是协议更改后,前后端未一起更新编译, Type:{type}"); return null; } } } }