Custom Object Serilization String Problem

Options
Lukas
Lukas
Hey, I have a prblem with serilzing a string with the Static Protocol Method.
I can Serialize float int and short with it but not string, i tried my own Method but this throws an ArgumentOutOfRangeException.

Is there a better way to serialize string into my byte[] ?

Here is the Code:
    public static byte[] SerializeDamageDealerInfo(DamageDealerInfo damageDealerInfo)
    {
        int index = 0;
        byte[] bytes = new byte[INTEGER_INT + INTEGER_INT];
        byte[] nameBytes = System.Text.Encoding.UTF8.GetBytes(damageDealerInfo.PlayerName);

        Protocol.Serialize((int)damageDealerInfo.DamageDealerType, bytes, ref index);
        Protocol.Serialize(damageDealerInfo.OwnerID, bytes, ref index);

        byte[] toReturn = new byte[bytes.Length + nameBytes.Length];
        Array.Copy(bytes, toReturn, bytes.Length);
        Array.Copy(nameBytes, 0, toReturn, bytes.Length, nameBytes.Length);

        return toReturn;
    }
public static DamageDealerInfo DeSerializeDamageDealerInfo(byte[] bytes)
    {
        int index = 0;

        int damageDealerTypeIndex;
        DamageDealerInfo.DamgaeDealerTypes type = DamageDealerInfo.DamgaeDealerTypes.Player;
        int ownerID;
        string name;

        Protocol.Deserialize(out damageDealerTypeIndex, bytes, ref index);
        Protocol.Deserialize(out ownerID, bytes, ref index);
        name = System.Text.Encoding.UTF8.GetString(bytes, index, bytes.Length);

        switch (damageDealerTypeIndex)
        {
            case 0:
                type = DamageDealerInfo.DamgaeDealerTypes.Player;
                break;
            case 1:
                type = DamageDealerInfo.DamgaeDealerTypes.Minion;
                break;
            case 2:
                type = DamageDealerInfo.DamgaeDealerTypes.Unit;
                break;
            case 3:
                type = DamageDealerInfo.DamgaeDealerTypes.Building;
                break;
        }

        DamageDealerInfo info = new DamageDealerInfo(type, name, ownerID);
        return info;
    }

Comments

  • Lukas
    Lukas
    edited November 2016
    Options
    Ok im stupid i found the problem, i had to use ASCII Encoding and forget to substract the index from the bytes lenght when i decode a part of the bytes[] to a string

    Here is the Working code if somebody is interested:
        public static byte[] SerializeDamageDealerInfo(DamageDealerInfo damageDealerInfo)
        {
            int index = 0;
            byte[] bytes = new byte[INTEGER_INT + INTEGER_INT];
            byte[] nameBytes = System.Text.Encoding.ASCII.GetBytes(damageDealerInfo.PlayerName);
    
            Protocol.Serialize((int)damageDealerInfo.DamageDealerType, bytes, ref index);
            Protocol.Serialize(damageDealerInfo.OwnerID, bytes, ref index);
    
            byte[] toReturn = new byte[bytes.Length + nameBytes.Length];
            Array.Copy(bytes, toReturn, bytes.Length);
            Array.Copy(nameBytes, 0, toReturn, bytes.Length, nameBytes.Length);
            return toReturn;
        }
        public static DamageDealerInfo DeSerializeDamageDealerInfo(byte[] bytes)
        {
            int index = 0;
    
            DamageDealerInfo.DamgaeDealerTypes type = DamageDealerInfo.DamgaeDealerTypes.Player;
            int damageDealerTypeIndex;
            int ownerID;
            string name;
    
            Protocol.Deserialize(out damageDealerTypeIndex, bytes, ref index);
            Protocol.Deserialize(out ownerID, bytes, ref index);
            name = System.Text.Encoding.ASCII.GetString(bytes, index, bytes.Length - index);
    
            switch (damageDealerTypeIndex)
            {
                case 0:
                    type = DamageDealerInfo.DamgaeDealerTypes.Player;
                    break;
                case 1:
                    type = DamageDealerInfo.DamgaeDealerTypes.Minion;
                    break;
                case 2:
                    type = DamageDealerInfo.DamgaeDealerTypes.Unit;
                    break;
                case 3:
                    type = DamageDealerInfo.DamgaeDealerTypes.Building;
                    break;
            }
            DamageDealerInfo info = new DamageDealerInfo(type, name, ownerID);
            return info;
        }