3

オブジェクトの C# 配列を文字列にシリアル化および逆シリアル化する最速の方法を探しています...

なぜバイト配列ではなく文字列なのですか? さて、私はネットワーキングシステム(具体的にはUnity3dネットワーキングシステム)で作業しており、バイト配列またはカスタムタイプの送信を許可しないというかなり面倒な制限を課しています.2つの必要なものです(私の状況を説明するのは難しいです) .

これに対して私が思いついた最も簡単な解決策は、オブジェクト配列を直接送信するのではなく、カスタム型を文字列にシリアル化し、その文字列を送信することです。

それで、それが問題です!オブジェクト配列を文字列にシリアル化する最速の方法は何ですか? Unity3d がそれらをカリングするかどうかわからないので、ブードゥー文字 (目に見えない/特殊文字) の使用を避けたいと思いますが、base64 エンコーディングは許可された文字スペクトルを十分に活用していません。また、base 64 の使用効率も気になります。

明らかに、これはネットワーク関連であるため、シリアル化されたデータをできるだけ小さくすることはプラスです。

編集:
これを行う1つの可能な方法は、バイト配列にシリアル化し、そのバイト配列が文字列であるふりをすることです。問題は、.Net 2.0 または Unity のネットワーク システムが、この方法を使用して作成された特殊文字または目に見えない文字の一部を選別することになるのではないかと心配していることです...これは非常に避ける必要があります。私は、これとほぼ同等の速度を持つソリューションを望んでいますが、カリングされる可能性のある文字は使用しません。(これらが何の文字かはわかりませんが、バイト配列から文字列への直接変換に関しては、Unityで悪い経験をしました)

4

3 に答える 3

4

Json.Netは、私が常にシンプルに使用するものであり、人間が判読できる方法で作業を完了します。Json は可能な限り軽量であり、ネットワーク経由でデータを送信するために広く使用されています。

この回答は受け入れられたものとして提供しますが、回答にbase64エンコーディングを追加することをお勧めします!

–ジョージ・オーツ・ラーセン

ありがとうございます。可読性が問題にならない場合は、これも素晴らしいオプションです。

于 2013-01-16T02:37:42.547 に答える
1
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);
}
于 2013-01-19T08:42:29.797 に答える
1

SoapFormatterを使用して、オブジェクトが Javascript 変数に埋め込まれ、それ以外の場合は「安全に」渡されるようにします。

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

    return Encoding.Default.GetString(oStream.ToArray());
}
于 2013-01-16T02:55:09.207 に答える