私は、私のゲームで使用するブロックの構造を格納するSchematicというクラスを持っています。私はBinaryFormatterを使用してそれらを保存しロードする方法を得ようとしていますが、逆シリアル化の問題があります。デシリアライズすると、元の型にキャストすることはできません。代わりに、整数の2次元配列である1つのフィールドしか取得できません。Deserializtionはクラスの代わりにクラスのフィールドを返します
はここで概略的なクラスのコードです:
[Serializable]
public class Schematic
{
public static Schematic BlankSchematic = new Schematic("BLANK");
public int[,] Blocks;
public V2Int Size;
public V2Int Location = V2Int.zero;
public string Name;
//---PROPERTIES---
//lower is more rare
public int Rarity = 100;
//---END PROPERTIES---
public Schematic(string name)
{
Name = name;
}
public Schematic(string name, int[,] blocks)
{
Name = name;
ModifyBlockArray(blocks);
}
public void ModifyBlockArray(int[,] newBlocks)
{
Blocks = newBlocks;
Size = new V2Int(newBlocks.GetLength(0), newBlocks.GetLength(1));
}
}
そしてシリアル化および逆シリアル化のための別のクラスで私の方法:私はシリアル化されたファイルの中に見たときので
public void SaveSchematic(Schematic schem)
{
using (Stream stream = new FileStream(SchematicsDirectory + "/" + schem.Name + ".schem", FileMode.Create, FileAccess.Write, FileShare.None))
{
BinaryFormatter bf = new BinaryFormatter();
Debug.Log(schem.GetType());
bf.Serialize(stream, schem);
}
}
public void LoadSchematics(string dir)
{
BinaryFormatter bf = new BinaryFormatter();
DirectoryInfo info = new DirectoryInfo(dir);
FileInfo[] fileinfo = info.GetFiles("*.schem");
for (int i = 0; i < fileinfo.Length; i++)
{
FileStream fs = new FileStream(dir + fileinfo[i].Name, FileMode.Open);
object tempO = bf.Deserialize(fs);
Debug.Log(tempO + ", " + tempO.GetType());
Schematic temp = (Schematic)tempO;
SchematicsByName.Add(temp.Name, temp);
Schematics.Add(temp);
print("Loaded Schematic: " + temp.Name);
fs.Close();
fs.Dispose();
}
}
それは非常に奇妙です、私は他のフィールドとクラス名 "回路図"を参照してください。ここに小さなサンプルファイルがあります:
ÿÿÿÿ Assembly-CSharp Schematic BlocksSizeLocationNameRarity System.Int32[,]V2Int V2Int V2Int xy
TestSavingd
V2Intはシリアライズ可能としてマークされています。私が逆直列化すると、クラス全体ではなくブロック配列が返されるのは本当に奇妙です。どんな助けでも大歓迎です。
これは私の最初の投稿ですので、間違いがあれば申し訳ありません。
を(私はそのコンストラクタに基づいてランダムV2Intクラスを調理)、これは最初の質問のために_ **非常に** _良いです!よくやった! - バイナリのシリアライゼーションタグを追加しました。既にシリアライゼーションのタイプをタグに指定すると便利かもしれないと考えました。 –
V2Intクラスの定義も投稿してください。 –