Obiekt do byte arr i odwrotnie bez serialize

0

Witam. Przymierzam sie do tłumaczenia pewnego gameservera z c++ do c#. Mam jeden mały problem(dokładnie to ponad setka) to structury pakietów. Już kilka godzin szukam jakiegoś zamiennika na proste rzutowanie nich do byte array i odwrotnie lecz marshala nawet protobuff rhird party nie spełnia moich oczekiwań. Pytanie jest jak poniższe funkcje bedą się sprawować względem szybkości? Biorąc pod uwage ok 100 clientów, packet srednio co pół sekundy. O reflection i optymalizacji mam małe pojecie wieć prosze o wyrozumiałość

public class Test2
{
public int aaa;
public int ccc;
public byte jj;
public byte[] gg = new byte[1] ;
}

 public T ObjectFromByteArray<T>(byte[] arr)
        {
           MemoryStream memoryStream = new MemoryStream(arr);
           BinaryReader binaryReader = new BinaryReader(memoryStream);
           
            T inst =(T)Activator.CreateInstance(typeof(T));
            var fields = inst.GetType().GetFields();
            foreach (var field in fields)
            {
                Type type = field.FieldType;
                if (type == typeof(int))
                {
                    field.SetValue(inst, binaryReader.ReadInt32());
                }
                if (type == typeof(byte))
                {
                    field.SetValue(inst, binaryReader.ReadByte());
                }
                if (type == typeof(byte[]))
                {
                   byte[] getArr = (byte[])field.GetValue(inst);
                    field.SetValue(inst, binaryReader.ReadBytes(getArr.Length));
                }
            }
            return inst;
        }
        public byte[] ObjectToByteArr(object obj)
        {
            List<byte> data = new List<byte>();
           
            var fields = obj.GetType().GetFields();
            foreach (var field in fields)
            {
                
                Type type = field.FieldType;
                if (type == typeof(int))
                {
                    data.AddRange(BitConverter.GetBytes((int)field.GetValue(obj)));
                }
                if (type == typeof(byte))
                {
                    data.Add((byte)field.GetValue(obj));
                }
                if (type == typeof(byte[]))
                {
                    data.AddRange((byte[])field.GetValue(obj));
                }
               
            }
            return data.ToArray();
        } 
0

Ogólnie refleksja jest dość wolna - w razie czego cache'uj takie rzeczy jak inst.GetType().GetFields();
Czemu marshal nie spełnia oczekiwań? I po co w ogóle serializujesz w taki sposób do tablicy bajtów? Czy klienci nie będą też w c#?

1 użytkowników online, w tym zalogowanych: 0, gości: 1