2

シリアル化の問題があります。シンプルな 3D データのブロックを保存してロードしたいと考えています。寸法 (幅、高さ、長さ) と整数の 3D 配列を含むクラスがあります。JSON は非常にうまくクラスを文字列に変換して保存しますが、再度変換するとうまく再生されません。

データクラス:

Public class cClusterData {
public int mWidth;
public int mHeight;
public int mLength;
public int[,,] mCellType;

public cClusterData()
{
    mCellType = new int[32,32,32];
}
}

それを保存するルーチン:

    public void SaveCluster()
{
    cClusterData lData = new cClusterData();
    lData.mWidth = mWidth;
    lData.mHeight = mHeight;
    lData.mLength = mLength;
    for (int lX = 0; lX < mWidth; lX++)
    {
        for (int lY = 0; lY < mHeight; lY++)
        {
            for (int lZ = 0; lZ < mLength; lZ++)
            {
                lData.mCellType[lX,lY,lZ] = (int)mCell[lX,lY,lZ].mType;
            }
        }
    }

    string lDataString = LitJson.JsonMapper.ToJson(lData);
    cFileUtils.WriteStringToFile("TestCluster", lDataString);
    Debug.Log("Done saving");
}

そして、それを再度ロードする関数:

    public void LoadCluster()
{
    string lDataString = cFileUtils.LoadStringFromFile("TestCluster");
    cClusterData lData = new cClusterData();
    lData = LitJson.JsonMapper.ToObject<cClusterData>(lDataString);
    Debug.Log("Loaded header " + lDataString);
    // convert cluster data to actual cluster
    mWidth = lData.mWidth;
    mHeight = lData.mHeight;
    mLength = lData.mLength;

    CreateBlankCluster();
    for (int lX = 0; lX < mWidth; lX++)
    {
        for (int lY = 0; lY < mHeight; lY++)
        {
            for (int lZ = 0; lZ < mLength; lZ++)
            {
                mCell[lX,lY,lZ].SetType((cCell.eCellType)lData.mCellType[lX,lY,lZ]);
            }
        }
    }
}

lData.mCellType にアクセスしようとするまでは、すべて問題ありません。その時点で、次のように NullReferenceException がスローされます。

NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません (wrapper managed-to-managed) object:ElementAddr (object,int,int,int)

私の推測では、配列がコンストラクターで設定される方法が関係していると思いますが、どこかで行が欠落しています。しかし、私はそれを解決することはできません。やれよ、インターネット!

4

1 に答える 1

1

コード スニペットには表示されませんが、[System.Serializable]このクラスの前に追加しましたか? これこれはどちらも同じ問題、カスタム クラスから始まり、すべての解決策はそれをクラスの先頭に追加することで見つかったようです。

于 2012-12-02T07:10:07.277 に答える