Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字典或列表转换为字节[]_C#_Unity3d_Prime31 - Fatal编程技术网

C# 将字典或列表转换为字节[]

C# 将字典或列表转换为字节[],c#,unity3d,prime31,C#,Unity3d,Prime31,好的,我在这里和unity论坛上都看到了许多类似的问题,询问如何从一种格式转换到另一种格式。我有一个(希望如此)简单的问题,我就是找不到答案。我正在使用Prime31的游戏中心插件来处理基于回合的多人游戏。在Prime31的插件中,他们要求您提供一个字节[],以便发送给其他玩家。(状态数据)那么问题是,将列表转换为字节数组,然后再将其从字节数组转换回的好方法是什么 作为参考,这是一个非常复杂的类,我以后可能需要添加更多的成员,但不能添加任何不同的类型。此外,int的列表(手牌)可以很容易地为4个

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

作为参考,这是一个非常复杂的类,我以后可能需要添加更多的成员,但不能添加任何不同的类型。此外,int的列表(手牌)可以很容易地为4个独立的int,如果这使得将扑克玩家列表转换为字节[]更容易的话。此外,此列表中没有设定长度,但始终为4-8

public class PokerPlayer{   
    public string playerID;
    public string alias;
    public int wildCard;
    public List<int> cardsInHand;
    public int chips;   
}
公共类扑克玩家{
公共字符串播放器ID;
公共字符串别名;
公共整数通配符;
公开名单卡;
公共int芯片;
}

我觉得当我看到答案的时候,我会因为没有早点看到答案而打自己一巴掌。任何指向相关材料的指针/链接都会很好,我已经在谷歌搜索了3个小时,有着相似的问题(如此相似),但不是完全相同的问题

您可能需要尝试序列化

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
现在是一种安全风险。如果我找到一个不用的好方法,我会回来的

编辑: 这仍然是谷歌的最佳结果,因此我将展示我如何摆脱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);
    }
}
公共静态类ExtendedSerialized
{
私有静态只读JsonSerializerSettings SerializerSettings=新JsonSerializerSettings
{
TypeNameHandling=TypeNameHandling.Auto,
};
公共静态字节[]序列化(此T源)
{
var asString=JsonConvert.SerializeObject(源,SerializerSettings);
返回Encoding.Unicode.GetBytes(asString);
}
公共静态T反序列化(此字节[]源)
{
var asString=Encoding.Unicode.GetString(源代码);
返回JsonConvert.DeserializeObject(asString);
}
}

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

太棒了,这是一条路,我不得不用谷歌从字节数组中获取列表,但这让我找到了正确的答案。非常感谢。嗨,这对我不起作用,你能帮忙吗?我是可转换的。在System.Convert.ChangeTypeQuestion中,您只需要将列表放入一个数组中,还是应该将整个PokerPlayer对象转移到其他位置?我正在尝试将这些PokerPlayer的列表转换为字节[],以便通过gamecenter通过空中传送。