将字典或列表转换为字节数组。

14

好的,我在这里和Unity论坛上看到了很多类似的问题,都是关于从一种格式转换为另一种格式的。我有一个(希望)简单的问题,但我找不到答案。 我正在使用Prime31的游戏中心插件处理回合制多人游戏。在Prime31的插件中,他们会要求您提供一个byte[]以发送给其他玩家(状态数据)。因此,问题是,将List转换为byte数组,然后如何将它们从byte数组转换回来?

作为参考,这是我需要的最复杂的类,可能以后还需要添加更多成员,但没有不同的类型。此外,int列表(手牌)可以轻松地分为4个单独的int,如果这使得将PokerPlayers列表转换为byte[]更容易。此外,这个列表不是固定长度的,但总是四到八个。

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

当我看到答案时,我感觉自己会因为没有早点发现答案而打自己耳光。如果有相关材料的指针/链接,那就太好了,我已经在谷歌上搜寻了3个小时了,找到了类似的问题(非常相似),但并不完全相同。


问题是,您只需要将列表放入数组中,还是整个PokerPlayer对象都应该传输到其他地方? - flohack
我所做的是尝试将这些扑克玩家列表转换为byte[],通过GameCenter发送出去。 - Grindz
3个回答

42

你可以尝试序列化。

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;

更新:

微软警告使用BinaryFormatter因为它是“不安全的,无法变得安全”。

请阅读aka.ms/binaryformatter获取更多详细信息。

首选替代方案:

.NET提供了几个内置的序列化程序,可以安全地处理不受信任的数据:


太棒了,这是正确的方法。我不得不通过谷歌搜索如何从字节数组中获取列表,但它带领我找到了正确的答案。非常感谢。 - Grindz
嗨,它对我没用,你能帮忙吗?IConvertible. in System.Convert.ChangeType - Vdovin Daniil
请查看 https://aka.ms/binaryformatter。Microsoft关于使用`BinaryFormatter`的警告:“当与不受信任的输入一起使用时,`BinaryFormatter.Deserialize`方法永远不安全。” - Galacticai

10

BinaryFormatter 已经成为一种安全风险。如果我找到一种不使用它的好方法,我会回来的。

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

编辑: 这仍然是谷歌搜索的最佳结果,所以我将展示如何远离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);
    }
}

如果您需要的是流而不是字节数组,从这里出发并不远。


1
将数据转换为字节流(以及反向操作)称为序列化(和反序列化)。
您可以使用BinaryFormatter类来完成此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接