2

JavaScriptクライアントとac#ソケットサーバーを使用して、JSONでメッセージを送受信しています。

サーバー上に私は次のような多次元配列を持っています:

MapData[0,0,0] = 1;
MapData[0,0,1] = 2;

その寸法は900x900x2です

JavaScriptで私がそうするなら私はjson.stringify(MapData)このようになります

[[[1,2],[3,4]]]

しかし、c#jsonconvert.serializeobject(MapData)は次のように私に与えます:[1,2,3,4]

誰かがc#シリアル化とJavaScript文字列化が異なる値を与えている理由を説明できますか?

私は試した

int[][][] MapData = new int[900][][];
// Zero out the map
for (int variable1 = 0; variable1 <= 899; variable1++) {
    for (int variable2 = 0; variable2 <= 899; variable2++) {
        MapData[variable1][variable2][0] = 0;
    }
}

ただし、MapData [variable1] [variable2] [0]=0で未処理のnull例外がスローされます。

ついにジェフの助けを借りてそれを理解した

int[][][] MapData = new int[900][][];
// Zero out the map
for (int a = 0; a < MapData.Length; a++)
{
    MapData[a] = new int[900][];
    for (int b = 0; b < MapData[a].Length; b++)
    {
        MapData[a][b] = new int[2];
        for (int c = 0; c < MapData[a][b].Length; c++)
                MapData[a][b][c] = 0;
    }
}

その後、JsonConvert.SerializeObject(MapData)は希望どおりに機能します

私を正しい方向に向けてくれてありがとうジェフ

4

1 に答える 1

2

JsonConvert.SerializeObject()イテレータを使用して配列の内容を取得し、シリアル化します。多次元配列はIEnumerableを実装しているため、その動作が見られます。

JsonConvert.SerializeObject()ギザギザの配列が与えられた場合に期待する結果が得られますMapData[0][0][1]

ジャグ配列を使用するように.NETコードを変更することが可能である場合は、それを行うことをお勧めします。そうでない場合は、シリアル化する前にオンザフライ変換を実行できます。

var jagged =  
    Enumerable.Range(0, MapData.GetLength(0)).Select(
        i => Enumerable.Range(0, MapData.GetLength(1)).Select(
            j => Enumerable.Range(0, MapData.GetLength(2)).Select(
                k => MapData[i,j,k]).ToArray()).ToArray()).ToArray();
JsonConvert.SerializeObject(jagged)
于 2013-02-15T22:30:27.213 に答える