2012-03-02 33 views
1
public void SerializeObject(string filename, T data) 
    { 
     // Get the path of the save game 
     string fullpath = filename; 

     // Open the file, creating it if necessary 
     //if (container.FileExists(filename)) 
     // container.DeleteFile(filename); 

     FileStream stream = (FileStream)File.Open(fullpath, FileMode.OpenOrCreate); 
     try 
     { 
      // Convert the object to XML data and put it in the stream 
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      serializer.Serialize(stream, data); //Thrown HERE 
     } 
     finally 
     { 
      // Close the file 
      stream.Close(); 
     } 
    } 

InvalidOperationExceptionをスローするのをやめる方法を教えてください。XmlSerializerアクセス​​が拒否されました

完全なエラーメッセージは次のとおりです。 一時クラス(結果= 1)を生成できません。 エラーCS0016:出力ファイル 'c:\ Users [MYUSERNAME] \ AppData \ Local \ Temp \ czdgjjs0.dllに書き込めませんでした。' - 'アクセスが拒否されました。

このエラーを回避する方法はわかりません。私はこのようになります私のレベルのクラスをシリアル化しようとしています

[Serializable] 
public class Level : ISerializable 
{ 
    public string Name { get; set; } 
    public int BestTime { get; set; } //In seconds 
    public List<Block> levelBlocks { get; set; } 
    public int Width { get; set; } 
    public int Height { get; set; } 

    public Level() 
    { 
    } 

    public Level(SerializationInfo info, StreamingContext ctxt) 
    { 
     this.Name = (String)info.GetValue("Name", typeof(String)); 
     this.BestTime = (int)info.GetValue("BestTime", typeof(int)); 
     this.levelBlocks = (List<Block>)info.GetValue("Blocks", typeof(List<Block>)); 
     this.Width = (int)info.GetValue("Width", typeof(int)); 
     this.Height = (int)info.GetValue("Height", typeof(int)); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
    { 
     info.AddValue("Name", this.Name); 
     info.AddValue("BestTime", this.BestTime); 
     info.AddValue("Blocks", this.levelBlocks); 
     info.AddValue("Width", this.Width); 
     info.AddValue("Height", this.Height); 
    } 
} 

マイブロッククラスは、同様の方法で実施され、保存されているのみで、位置ベクトルを保持しています。

以下

、私の方法を保存します。

public static void Save() 
    { 
     string filename = "saved.xml"; 

     Level toSave = new Level(); 
     toSave.levelBlocks = new List<Block>(); 

     //TODO: build toSave 
     toSave.Name = "This is a level!"; 
     toSave.BestTime = 0; 
     foreach (Entity e in EntityController.Entities) 
     { 
      if (e is Block) 
      { 
       toSave.levelBlocks.Add((Block)e); 
       if (e.Position.X > toSave.Width) 
        toSave.Width = (int)e.Position.X; 
       if (e.Position.Y > toSave.Height) 
        toSave.Height = (int)e.Position.Y; 
      } 
     } 

     serializer.SerializeObject(filename, toSave); 
    } 

私のプログラムでは、XNAゲームです。

+0

あなたは 'SerializeObject'をどのように呼び出すことができますか? – Turbot

+0

確かに、私はそれを追加しました。 – Runewake2

+0

Sheldonの答えによると、ASP.NETを使用している場合は、IISワーカープロセスがtempDirectoryにアクセスする権限を持っていることを確認します。それ以外の場合は、専用フォルダに事前設定します。 – Turbot

答えて

0

ここで受け入れられる回答System.InvalidOperationException: Unable to generate a temporary class (result=1)はあなたにとって妥当な解決策を持つ可能性が高いです。

1つの可能性はありません:ASP.NETを使用している場合、web.configの一時ディレクトリが変更されています。コンパイル要素(ここではhttp://msdn.microsoft.com/en-us/library/s10awwz0.aspx)のtempDirectory属性をチェックし、ASP.NETプロセスにアクセスできる場所に変更してください。

最終的には、シリアル化を行っているプロセスでコードを生成してディスクに書き込む必要があり、権限がないという問題があります。そのプロセスの権限を与えたり、権限がある場所に場所を変更したり、状況に応じてsgen.exeを使用したりすることができます。

+0

さらなる調査の結果、エラーはさらに面白くなりました。すべてのユーザー(私は唯一の人です)が私の一時フォルダに完全にアクセスできますので、どうすれば許可が拒否されますか? 私はまた、VSの外部で管理者としてバイナリを実行しようとしましたが、これは効果がありませんでした。 私のプログラムは、違いがあれば、XNAゲームです。 – Runewake2

1

COMODOアンチウイルスを使用してCS0016エラーが発生しますか?

COMODOコマンドウィンドウ(メインウィンドウ)を開き、SANDBOXを確認します。アプリケーションが「制限付き」のフラグが付けられているアプリケーションとしてリストされている場合は、右クリックしてポップアップからオプションを選択し、アプリケーションを信頼できるアプリケーションとして追加します。または、COMODOをアンインストールしてリブートしてください.CS0016エラーの問題を解決するはずです。

+0

あなたはジャックポットをヒットしました、ありがとう! – Bronek

関連する問題