Преобразовать словарь или список в байт []

Хорошо, я видел много похожих вопросов здесь и на форумах Unity, спрашивающих о конвертации из одного формата в другой. У меня есть (надеюсь) простой вопрос, на который я просто не могу найти ответ. Я использую плагин Game-Center от Prime31 для управления пошаговой многопользовательской игрой. Внутри плагина для Prime31 они просят вас отправить байт [] другим игрокам. (Данные о состоянии) Итак, вопрос в том, что было бы хорошим способом преобразовать список в байтовый массив и затем преобразовать их обратно из байтового массива?

для справки, это настолько сложный класс, насколько мне нужно, возможно, мне понадобится добавить больше членов позже, но не каких-либо других типов. ТАКЖЕ список int (карты в руке) может быть легко разделен на 4, если это упрощает преобразование списка PokerPlayers в байт []. Также в этом списке не установлена ​​длина, но всегда будет 4-8.

public class PokerPlayer{   
    public string playerID;
    public string alias;
    public int wildCard;
    public List<int> cardsInHand;
    public int chips;   
}

Мне кажется, что когда я увижу ответ, я ударю себя за то, что не вижу ответа раньше. Любые указатели / ссылки на соответствующие материалы были бы хороши, я искал Google в течение хороших 3 часов с похожими (ТАК похожими), но не совсем такими же вопросами.

3 ответа

Решение

Вы можете попробовать сериализацию.

var binFormatter = new BinaryFormatter();
var mStream = new MemoryStream();
binFormatter.Serialize(mStream, myObjToSerialize);

//This gives you the byte array.
mStream.ToArray();

И затем, если вы хотите превратить байтовый массив обратно в объект:

var mStream = new MemoryStream();
var binFormatter = new BinaryFormatter();

// Where 'objectBytes' is your byte array.
mStream.Write (objectBytes, 0, objectBytes.Length);
mStream.Position = 0;

var myObject = binFormatter.Deserialize(mStream) as YourObjectType;

теперь угроза безопасности. Если я найду способ сделать это, не используя его, я вернусь

https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/5.0/binaryformatter-serialization-obsolete

Изменить: это по-прежнему лучший результат в Google, поэтому я покажу, что я сделал, чтобы отойти от BinaryFormatter

Вам нужен Newtonsoft.Json

      public static class ExtendedSerializerExtensions
{
    private static readonly JsonSerializerSettings SerializerSettings = new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.Auto,
    };

    public static byte[] Serialize<T>(this T source)
    {
        var asString = JsonConvert.SerializeObject(source, SerializerSettings);
        return Encoding.Unicode.GetBytes(asString);
    }

    public static T Deserialize<T>(this byte[] source)
    {
        var asString = Encoding.Unicode.GetString(source);
        return JsonConvert.DeserializeObject<T>(asString);
    }
}

Отсюда не так уж далеко, если вам нужен поток, а не массив байтов

Преобразование данных в поток байтов (и обратно) называется serialization (и десериализация).

Вы можете использовать класс BinaryFormatter для этого.

Другие вопросы по тегам