1

シリアル化:

            bool[] tempArray = new bool[MapWidth * MapHeight];
            for (int i = 0; i < MapWidth; i++)
            {
                for (int ii = 0; ii < MapHeight; ii++)
                {
                    tempArray[i * ii] = mapSolid[i, ii];
                }
            }
            BitArray bits = new BitArray(tempArray);
            byte[] bytes = new byte[32 * MapWidth];
            bits.CopyTo(bytes, 0);
            bin.Serialize(stream, Convert.ToBase64String(bytes));

Desrialization:

byte[] bytes = new byte[255 * 255];
                    bytes=Convert.FromBase64String((string)bin.Deserialize(stream));
                    //mapSolid = ;
                    MapWidth = (int)bin.Deserialize(stream);
                    MapHeight = (int)bin.Deserialize(stream);
                    BitArray bits = new BitArray(bytes);
                    bool[] bytestemp = new bool[255*265];
                    bits.CopyTo(bytestemp, 0);
                    for (int i = 0; i < MapWidth; i++)
                    {
                        for (int ii = 0; ii < MapHeight; ii++)
                        {
                            mapSolid[i, ii] = bytestemp[i*ii];
                        }
                    }

これで、すべてがエラーなしで機能しているように見えますが、逆シリアル化後にマップの構造が失われます。

4

1 に答える 1

2
tempArray[i * ii]

bytestemp[i * ii]

間違っている; そのインデックスは次のようになります。

(i * MapWidth) + ii

また

i + (ii * MapHeight)

行を最初に書き込むか、列を最初に書き込むかによって異なります。

それ以外の場合、たとえば、セル{1,4}と{4,1}は同じ場所に格納されます。

数学を避けたい場合、別の一般的なアプローチは次のとおりです。

int offset = 0;
for (int i = 0; i < MapWidth; i++)
{
    for (int ii = 0; ii < MapHeight; ii++)
    {
        tempArray[offset++] = mapSolid[i, ii];
    }
}

int offset = 0;
for (int i = 0; i < MapWidth; i++)
{
    for (int ii = 0; ii < MapHeight; ii++)
    {
        mapSolid[i, ii] = bytestemp[offset++];
    }
}

つまり、毎回「次の位置」から/への読み取り/書き込みを行うだけです。読み取りループと書き込みループがどちらが外側/内側ループであるかについて一致していることを確認してください(そう思われます)。

于 2012-10-22T09:45:22.240 に答える