14

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

作为参考,这是一个我需要的复杂类,我可能需要稍后添加更多成员,但不是任何不同的类型。此外,如果这使得将 PokerPlayers 列表转换为 byte[] 变得更容易,那么 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 个小时,其中包含类似(非常相似)但不完全相同的问题。

4

3 回答 3

39

您可能想尝试序列化。

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 提供了几个内置序列化程序,可以安全地处理不受信任的数据:

于 2014-04-09T19:56:46.807 回答
5

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

https://docs.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);
    }
}

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

于 2021-02-08T17:51:44.437 回答
2

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

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

于 2014-04-09T19:59:59.217 回答