2016-07-17 12 views
1

私は、私のゲームで使用するブロックの構造を格納する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はシリアライズ可能としてマークされています。私が逆直列化すると、クラス全体ではなくブロック配列が返されるのは本当に奇妙です。どんな助けでも大歓迎です。

これは私の最初の投稿ですので、間違いがあれば申し訳ありません。

+0

を(私はそのコンストラクタに基づいてランダムV2Intクラスを調理)、これは最初の質問のために_ **非常に** _良いです!よくやった! - バイナリのシリアライゼーションタグを追加しました。既にシリアライゼーションのタイプをタグに指定すると便利かもしれないと考えました。 –

+0

V2Intクラスの定義も投稿してください。 –

答えて

0

サンプルスニペットで試してみましたが、正しくシリアル化されてデシリアライズされました。送信されているSchematicオブジェクトにすべての正しい値があることを確認してください。一般的には、

最終的な値の最良の賭けです。シリアライズされたファイルを見ないでください。 また、間違った型を直列化解除した場合、この行は通常、キャスト例外をスローします。

Schematic temp = (Schematic)tempO; 

ですので、次のスニペットを実行してお知らせください。 それは私のために大丈夫でした。私が見てどこに私は間違いを見ていない

public static string SchematicsDirectory = "d:\\temp\\s"; 

    static void Main(string[] args) 
    { 
     var p = new Program(); 

     var array = new int[2, 2]; 
     array[0, 0] = 1; 
     array[0, 1] = 2; 
     array[1, 0] = 3; 
     array[1, 1] = 4; 

     var testObject = new Schematic("fezzik", array); 

     p.SaveSchematic(testObject); 
     p.LoadSchematics(SchematicsDirectory + "/"); 
    } 

enter image description here

+0

なぜ以前に動作していなかったのか分かりません。変更を加えずにもう一度試してみました。たぶん私のコンピュータはちょうど怒っていたか、何か笑いました。返信いただきありがとうございます。 – Xyag

+0

cool。追加の入力として、fs.close、fs.disposeを実行する必要はありません。C#では、 'using'キーワードを使用すると簡単になります.. auto-disposable .. using(var fs = new FileStream(dir + fileinfo [ i] .Name、FileMode.Open)){ オブジェクトのtempO = bf.Deserialize(fs); Debug.Log(tempO + "、" + tempO.GetType()); スケマティックtemp =(スケマティック)tempO; SchematicsByName.Add(temp.Name、temp); Schematics.Add(temp); print( "ロードされた回路図:" + temp.Name); } –

関連する問題