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));

反序列化:

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 回答