public static byte[] Packet <TObj>(TObj obj, Endian endian = Endian.BIG_ENDIAN, Encoding?textEncoding = null) where TObj : class { if (!IsInitialized) { throw new InvalidOperationException($"在调用此方法前,应先调用 {nameof(RegisterTypes)} 来注册 ByteProto 即将用到的实体类型"); } var desc = GetTargetDescriptor(typeof(TObj)); if (desc.EntityAttribute is not ByteProtoPacketAttribute packetAttr) { throw new InvalidOperationException("该实体不能作为单独的网络包发送"); } // Write Body First var bodyBytes = ByteProtoSerializer.Serialize(obj, desc, endian, textEncoding); using var writer = BytesFactory.GetWriter(endian); writer.WriteByte(packetAttr.Version); // 版本号,不同的版本可有不同的序列化方式 ByteProtoSerializer.WriteCompressedSize(writer, packetAttr.PacketType); // type ByteProtoSerializer.WriteCompressedSize(writer, bodyBytes.Length); // body size writer.WriteBytes(bodyBytes); // body content return(writer.Bytes.ToArray()); }
public static byte[] Serialize <TObj>(TObj obj, Endian endian = Endian.BIG_ENDIAN, Encoding?textEncoding = null) where TObj : class { using var bodyWriter = BytesFactory.GetWriter(endian); // Write Body var desc = ByteProto.GetTargetDescriptor(typeof(TObj)); WriteObject(desc, obj, bodyWriter, textEncoding ?? Encoding.UTF8); return(bodyWriter.Bytes.ToArray()); }
public static object Deserialize(Type outType, byte[] rawData, Endian endian = Endian.BIG_ENDIAN, Encoding?textEncoding = null) { if (!ByteProto.TargetHasDescriptor(outType, out var desc) || desc == null) { throw new Exception($"cannot find a class for type: {outType} "); } var reader = BytesFactory.GetReader(rawData, endian); return(ReadObject(reader, desc, textEncoding ?? Encoding.UTF8)); }