将C#对象数组序列化为字符串的最快方法

时间:2013-01-16 02:34:34

标签: c# string networking serialization unity3d

我正在寻找将C#对象数组序列化和反序列化为字符串的最快方法......

为什么是字符串而不是字节数组?好吧,我正在使用一个网络系统(具体的Unity3d网络系统),他们放置了一个相当烦人的限制,不允许发送字节数组或自定义类型,我需要两件事(很难解释我的情况)

我为此提出的最简单的解决方案是将自定义类型序列化为字符串,然后传输该字符串,而不是直接发送对象数组。

所以,这就是问题!将对象数组序列化为字符串的最快方法是什么?我最好避免使用巫毒字符(不可见/特殊字符),因为我不确定Unity3d是否会剔除它们,但base64编码并没有充分利用允许的字符频谱。我也担心使用base 64的效率。

显然,由于这与网络有关,因此序列化数据尽可能小是一个优势。

编辑:
一种可能的方法是序列化为字节数组,然后假装该字节数组是一个字符串。问题是,我担心.Net 2.0或Unity的网络系统最终会剔除使用这种方法创建的一些特殊或不可见的字符......非常需要避免的东西。我希望有一个与此速度接近或相同的解决方案,但不使用任何可能被剔除的字符。 (我不知道这些是什么字符,但是当我从字节数组直接转换为字符串时,我遇到了很糟糕的经验)

3 个答案:

答案 0 :(得分:4)

Json.Net是我总是使用它的简单方法,并以人类可读的方式完成工作。 Json的重量很轻,并且被广泛用于通过网络发送数据。

  

我会接受这个答案,但我建议你在答案中添加base64编码!

     

-Georges Oates Larsen

谢谢,如果可读性不是问题,这也是一个很好的选择。

答案 1 :(得分:1)

我们使用SoapFormatter,以便将对象嵌入到Javascript变量中,否则将“安全”传递:

using (MemoryStream oStream = new MemoryStream())
{
    (new SoapFormatter()).Serialize(oStream, theObject);

    return Encoding.Default.GetString(oStream.ToArray());
}

答案 2 :(得分:0)

using(MemoryStream s = new MemoryStream()) {
    new BinaryFormatter().Serialize(s, obj);
    return Convert.ToBase64String(s.ToArray());
}

using(MemoryStream s = new MemoryStream(Convert.FromBase64String(str))) {
    return new BinaryFormatter().Deserialize(s);
}