Преобразовать словарь или список в байт []
Хорошо, я видел много похожих вопросов здесь и на форумах 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;
теперь угроза безопасности. Если я найду способ сделать это, не используя его, я вернусь
Изменить: это по-прежнему лучший результат в 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 для этого.