2012-03-02 3 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 Access Denied

Полное сообщение об ошибке: Невозможно создать временный класс (результат = 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

в соответствии с ответом Шелдона, если вы используете ASP.NET, убедитесь, что ваш рабочий процесс IIS имеет разрешение на доступ к tempDirectory, в противном случае предварительно установленный в выделенную папку. – Turbot

ответ

0

Принятый здесь ответ System.InvalidOperationException: Unable to generate a temporary class (result=1) может иметь разумное решение для вас.

Одна из возможностей, которую они не предлагали: если вы используете ASP.NET, это изменение каталога temp в файле web.config. Проверьте атрибут tempDirectory элемента компиляции (информация здесь http://msdn.microsoft.com/en-us/library/s10awwz0.aspx) и измените на то, к чему у вашего процесса ASP.NET есть.

В конечном счете, ваша проблема заключается в том, что процесс, выполняющий сериализацию, должен генерировать и записывать некоторый код на диск и не имеет разрешений. Вы можете предоставить разрешения для этого процесса, изменить местоположение на то место, где оно имеет разрешения, или использовать sgen.exe, в зависимости от того, что лучше всего подходит для вашей ситуации.

+0

При дальнейших исследованиях ошибка стала еще более интересной. Каждый пользователь (я единственный) имеет полный доступ к моей временной папке, поэтому как вы/я получаю разрешение на отказ? Я также попытался запустить двоичный файл как администратор вне VS, это не повлияло. Моя программа - игра XNA, если это имеет значение. – Runewake2

1

Использовать антивирус COMODO и получить CS0016 ошибку?

Откройте командное окно COMODO (главное окно) и проверьте SANDBOX. Если ваше приложение указано как приложение, которое было помечено как «ограниченное», просто щелкните правой кнопкой мыши и выберите параметр из всплывающего окна, чтобы добавить приложение в качестве доверенного приложения. Или просто удалите COMODO и перезагрузитесь. Это должно решить проблему с ошибкой CS0016.

+0

Вы попали в джекпот, спасибо! – Bronek