Search code examples
c#unity-game-engineprime31

convert dictionary or list to byte[]


Ok, i've seen many similar questions both on here and unity forums asking about converting from one format to another. I've got a (hopefully) simple question that i just can't find the answer for. I'm using the game-center plugin from Prime31 to handle a turn based multi-player game. Inside the plugin for Prime31 they ask you for a byte[] to send to the other players. (State data) So the question is, what would be a good way to convert a List to a byte array AND then convert them back from byte array?

for reference this is as complicated a class as i need, i might need to add more members later, but not any different types. ALSO the list of int's(cards in hand) could easily be 4 separate int if that makes converting the list of PokerPlayers to an byte[] any easier. Also at this list is not a set length but will always be 4-8.

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

I feel like the when i see the answer I'm going to smack myself for not seeing the answer sooner. Any pointers/ links to relevant materials would be sweet, i've searched google for a good 3 hours now with similar (SO similar) but not quite the same questions.


Solution

  • You may want to try serialization.

    var binFormatter = new BinaryFormatter();
    var mStream = new MemoryStream();
    binFormatter.Serialize(mStream, myObjToSerialize);
    
    //This gives you the byte array.
    mStream.ToArray();
    

    And then if you want to turn the byte array back into an object:

    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;
    

    Update:

    Microsoft warns about using BinaryFormatter because it is "insecure and can't be made secure".

    Please read aka.ms/binaryformatter for more details.

    Preferred alternatives

    .NET offers several in-box serializers that can handle untrusted data safely: