2012-03-21 16 views
1

NetDataContractSerializerを使用しています。私はデータファイルにオブジェクトを作成、追加、シリアル化することができます。ファイルをGUIにリロードすることは問題ありません。オブジェクトの削除後のシリアル化エラー(NetDataContractSerializer)

しかし、データからオブジェクトを削除(削除)し、データを再保存(シリアル化)しようとすると問題が発生します。

ここに私の部屋の削除ボタンがあります。ユーザが特定の階の部屋の削除を要求すると、その特定の階のその特定の部屋に存在するオブジェクトのリストが作成される。その後、それらを削除し、表示している現在のフォームを閉じて、データを保存します。

プログラムがクラッシュせず、現在のフロアの部屋のリストから部屋が削除されているので、これはうまくいくようです。 。。

「のオブジェクトを逆シリアル化エラーが発生しましたルートレベルのデータが無効である1行目:私は(クローズプログラム、オープンおよびロード)ファイルを再ロードしようとしたとき

は、しかし、私はこのエラーを取得します、位置1。ここで

ここに私のdeleteRoomボタンここ

 private void btn_deleteRoom_Click(object sender, EventArgs e) 
    { 
     var assets = getAssetsForCurrentRoom(); 
     string warningMessage = "Deleting this room will delete this room and all contained assets! Are you sure you want to do this?"; 
     string caption = "WARNING!"; 
     MessageBoxButtons buttons = MessageBoxButtons.YesNo; 
     DialogResult result; 
     //Display the MessageBox 
     result = MessageBox.Show(warningMessage, caption, buttons); 
     if (result == System.Windows.Forms.DialogResult.Yes) 
     { 
      var itemsToRemove = new ArrayList(); 
      foreach (var item in currentHouse.GetAssets()) 
      { 
       if (item.Parent.Name == currentRoom.Name) 
       { 
        itemsToRemove.Add(item); 
       } 
      } 
      foreach (var item in itemsToRemove) 
      { 
       currentHouse.deleteAsset((Asset)item); 
      } 
      currentHouse.DeleteRoom(currentRoom); 
      PersistanceController.SaveHouseWithCurrentPath(currentHouse); 
      this.Close(); 
     } 
    } 

は方法deleteAsset(のための私のCRUDです)

public void deleteAsset(Asset asset) 
    { 
     //is null? 
     if (asset == null) 
     { 
      throw new ArgumentNullException("asset", "Asset cannot be null."); 
     } 
     //is blank 
     if (string.IsNullOrWhiteSpace(asset.Name)) 
     { 
      throw new ArgumentNullException("asset", "Asset name cannot be blank | null."); 
     } 
     var listAsset = _assets.FirstOrDefault(existingAsset => (existingAsset.Name == asset.Name)); 
     if (listAsset != null) 
     { 
      _assets.Remove(asset); 
     } 
     else 
     { 
      throw new InvalidOperationException("Asset does not exist; thus it can not be deleted."); 
     } 
    } 

は、私はあなただと思う私のPersistanceController

public static class PersistanceController 
{ 

    public static string LastLoadedPath { get; set; } 

    public static House LoadHouse(string path) 
    { 
     NetDataContractSerializer houseDeserializer = new NetDataContractSerializer(); 

     FileStream houseFileStream = new FileStream(path, FileMode.Open); 
     House deserialzedHouse = (House)houseDeserializer.Deserialize(houseFileStream); 

     houseFileStream.Close(); 

     LastLoadedPath = path; 

     return deserialzedHouse; 
    } 

    public static void SaveHouseWithCurrentPath(House house) 
    { 
     SaveHouse(house, LastLoadedPath); 
    } 

    public static void SaveHouse(House house, string path) 
    { 

     //save house 
     NetDataContractSerializer xmlSerializer = new NetDataContractSerializer(); 
     Stream streamWriter = new FileStream(path, FileMode.OpenOrCreate); 
     xmlSerializer.Serialize(streamWriter, house); 

     streamWriter.Close(); 
    } 
} 

答えて

2

です問題はFileMode.OpenOrCreate。それをちょうどFileMode.Createにするか、元の(長い)ファイルから不要な尾を持つことになります。

そして、トピックでは、using() {}ブロックを使用してFileStreamを処理してください。

+0

......ありがとうございました。 =) – Ealianis

関連する問題