Esempio n. 1
0
        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());
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
        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));
        }