将字典或列表转换为byte []

时间:2014-04-09 19:49:57

标签: c# unity3d prime31

好的,我在这里和团结论坛上看过很多类似的问题,询问从一种格式转换到另一种格式。我有一个(希望)简单的问题,我无法找到答案。我使用Prime31的游戏中心插件来处理基于回合的多人游戏。在Prime31的插件中,他们会要求您输入一个字节[]发送给其他玩家。 (状态数据)所以问题是,将List转换为字节数组然后将它们从字节数组转换回来的好方法是什么?

作为参考,这是我需要的一个复杂的类,我可能需要稍后添加更多的成员,但不是任何不同的类型。如果这使得将PokerPlayers列表转换为字节[]更容易,那么int的列表(手中的牌)可以很容易地成为4个单独的int。此列表也不是设定长度,但始终为4-8。

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

我觉得当我看到答案的时候,我会因为没有尽快看到答案而嗤之以鼻。任何指向相关材料的指针/链接都是甜蜜的,我现在用谷歌搜索了3个小时,类似(SO类似)但不完全相同的问题。

3 个答案:

答案 0 :(得分:25)

您可能想尝试序列化。

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;

答案 1 :(得分:3)

BinaryFormatter 现在存在安全风险。如果我找到一个不使用它的好方法,我会回来

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

如果你需要一个流而不是一个字节数组,离这里不远

答案 2 :(得分:2)

将数据转换为字节流(和返回)称为serialization(和反序列化)。

您可以使用BinaryFormatter类来执行此操作。