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