【问题标题】:convert dictionary or list to byte[]将字典或列表转换为字节[]
【发布时间】:2014-04-09 19:49:57
【问题描述】:

好的,我在这里和统一论坛上都看到了许多类似的问题,询问有关从一种格式转换为另一种格式的问题。我有一个(希望如此)简单的问题,但我找不到答案。我正在使用 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 个小时。

【问题讨论】:

  • 问题,你只需要将列表放入数组中,还是将整个 PokerPlayer 对象转移到其他地方?
  • 我正在尝试将这些 PokerPlayers 的列表转换为 byte[] 以通过游戏中心无线发送。

标签: c# unity3d prime31


【解决方案1】:

您可能想尝试序列化。

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;

更新:

Microsoft 对使用 BinaryFormatter 发出警告,因为它“不安全且无法确保安全”。

请阅读aka.ms/binaryformatter了解更多详情。

首选替代品

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

【讨论】:

  • 真棒这是要走的路,我不得不谷歌从字节数组中获取列表,但它引导我找到正确的答案。非常感谢。
  • 嗨,它对我不起作用,你能帮忙吗? I敞篷车。在 System.Convert.ChangeType
  • 请查看aka.ms/binaryformatter。微软关于使用BinaryFormatter 的警告“BinaryFormatter.Deserialize 方法在与不受信任的输入一起使用时永远不会安全。”。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2017-04-23
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多