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ゲームです。
あなたは 'SerializeObject'をどのように呼び出すことができますか? – Turbot
確かに、私はそれを追加しました。 – Runewake2
Sheldonの答えによると、ASP.NETを使用している場合は、IISワーカープロセスがtempDirectoryにアクセスする権限を持っていることを確認します。それ以外の場合は、専用フォルダに事前設定します。 – Turbot