シリアル化の問題があります。シンプルな 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)
私の推測では、配列がコンストラクターで設定される方法が関係していると思いますが、どこかで行が欠落しています。しかし、私はそれを解決することはできません。やれよ、インターネット!