2016-01-15 19 views
5

Nella mia app universale per Windows sto memorizzando i dati utente trasformando i suoi oggetti in file xml tramite XmlSerializer.UWP con xmlSerializer - System.InvalidOperationException: impossibile generare una classe temporanea (risultato = 1) errore di compilazione

L'applicazione stava compilando, costruzione e funziona perfettamente fino in qualche modo (senza alcuna modifica sul codice) la build per il rilascio iniziato a darmi questo errore: System.InvalidOperationException: Impossibile generare una classe temporanea (risultato = 1).

Se creo o eseguo l'app su debug, funziona in modo impeccabile ma al momento del rilascio (con la catena di strumenti nativi .NET attiva) ottengo l'errore.

Ho già dato il permesso alla cartella C: \ Windows \ Temp a tutti. Anche mia madre ha accesso ad esso, ma l'errore rimane.

Se si tratta di un problema di lettura/scrittura su XmlSerializer, mi chiedo se è possibile modificare la cartella temporanea serializzatore nel progetto UWP.

Ecco il codice che ho usato per serializzare gli oggetti:

public static async Task<T> ReadObjectFromXmlFileAsync<T>(string filename) 
    { 
     // this reads XML content from a file ("filename") and returns an object from the XML 
     T objectFromXml = default(T); 
     var serializer = new XmlSerializer(typeof(T)); 
     StorageFolder folder = ApplicationData.Current.LocalFolder; 
     StorageFile file = await folder.GetFileAsync(filename).AsTask().ConfigureAwait(false); 
     Stream stream = await file.OpenStreamForReadAsync().ConfigureAwait(false); 
     objectFromXml = (T)serializer.Deserialize(stream); 
     stream.Dispose(); 
     return objectFromXml; 
    } 

    public static async Task SaveObjectToXml<T>(T objectToSave, string filename) 
    { 
     // stores an object in XML format in file called 'filename' 
     var serializer = new XmlSerializer(typeof(T)); 
     StorageFolder folder = ApplicationData.Current.LocalFolder; 
     StorageFile file = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting).AsTask().ConfigureAwait(false); 
     Stream stream = await file.OpenStreamForWriteAsync().ConfigureAwait(false); 

     using (stream) 
     { 
      serializer.Serialize(stream, objectToSave); 
     } 
    } 

    //This uses a subfolder 
    public static async Task<T> ReadObjectFromXmlFileAsync<T>(string filename) 
    { 
     // this reads XML content from a file ("filename") and returns an object from the XML 
     T objectFromXml = default(T); 
     var serializer = new XmlSerializer(typeof(T)); 
     StorageFolder folder = ApplicationData.Current.LocalFolder; 
     StorageFolder subFolder = await folder.GetFolderAsync("Notes").AsTask().ConfigureAwait(false); 
     StorageFile file = await subFolder.GetFileAsync(filename).AsTask().ConfigureAwait(false); 
     Stream stream = await file.OpenStreamForReadAsync().ConfigureAwait(false); 
     objectFromXml = (T)serializer.Deserialize(stream); 
     stream.Dispose(); 
     return objectFromXml; 
    } 

Che cosa mi manca? Qualcuno può aiutare?

+0

Se si attiva la registrazione del livello di diagnostica, potrebbero esserci altri indizi.Se questo non è delucidante, non esitate a inviarci una mail a [email protected] Non che la gente non sarà in ufficio fino a martedì a causa delle vacanze del giorno MLK. –

+0

Penso che nel tuo caso facendo un T temp = default (T) userà reflection e il compilatore .NET nativo proverà a creare oggetti "temp" per contenere qualsiasi dato necessario per serializzare o deserializzare, ma non ne sa nulla, risultando in un KABOOM. obj.GetType lo farebbe per me in VB.net. Fai di quel ragazzo cattivo una variante senza creare un tipo predefinito e penso che starai bene. – sonofsmog

risposta

0

Ti stai riferendo a progetti con i file di serializzazione XML che sono stati "aggiunti come link" in essi per caso? (Che cosa ha causato l'errore citato nel mio caso) In tal caso, qui è il ...

... SOLUZIONE:

A quanto pare, è ancora possibile utilizzare la via “Aggiunto come Link” di code sharing, ma per abilitare "Compile con .NET Native tool chain" senza nessuno di quegli oscuri errori irrilevanti, è necessario spostare i file "Added as Link" nel progetto del chiamante.

0

Appena arrivato qui per aiutare chiunque altro si imbattesse in questo problema. Sembra che quando .NET nativo si sta compilando, si incontreranno dei problemi se si hanno classi che saranno serializzate/deserializzate in Xml che contengono riferimenti a cose come HorizontalAlignment e VerticalAlignment. Davvero fastidioso, attualmente sto usando Visual Studio Update 3 e ho ancora questo problema.

Per una spiegazione più meglio vedere questa risposta stack overflow:

http://stackoverflow.duapp.com/questions/37680536/cant-build-uwp-in-release-mode/37865469#37865469

0

Ho lo stesso errore esatto con questo codice quasi identico:

Public Async Function SerializeObjectToStorage(ByVal obj As Object, ByVal filename As String) As Task(Of Boolean) 
    Dim localFolder As Windows.Storage.StorageFolder 
    Try 
     Dim objStringWriter As New StringWriter 
     Dim x As New XmlSerializer(obj.GetType) 
     x.Serialize(objStringWriter, obj) 
     localFolder = Windows.Storage.ApplicationData.Current.LocalFolder 
     Dim myFile As Windows.Storage.StorageFile = Await localFolder.CreateFileAsync(filename, Windows.Storage.CreationCollisionOption.ReplaceExisting) 
     Dim stream = Await myFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite) 
     Using outputStream = stream.GetOutputStreamAt(0) 
      Dim dataWriter As New DataWriter(outputStream) 
      dataWriter.WriteString(objStringWriter.ToString) 
      Await dataWriter.StoreAsync() 
      Await outputStream.FlushAsync() 
      stream.Dispose() 
     End Using 
    Catch ex As Exception 
     Return False 
    End Try 
    Return True 
End Function 
Public Async Function DeserializeStorageToObject(ByVal obj As Object, ByVal filename As String) As Task(Of Object) 
    Dim localFolder As Windows.Storage.StorageFolder 
    Try 
     Dim objStringWriter As New StringWriter 
     Dim x As New XmlSerializer(obj.GetType) 
     x.Serialize(objStringWriter, obj) 
     localFolder = Windows.Storage.ApplicationData.Current.LocalFolder 
     Dim myFile As Windows.Storage.StorageFile = Await localFolder.GetFileAsync(filename) 
     Dim stream = Await myFile.OpenAsync(Windows.Storage.FileAccessMode.Read) 
     Dim size = stream.Size 

     Using inputStream = stream.GetInputStreamAt(0) 
      Dim dataReader As New DataReader(inputStream) 
      Dim numBytesLoaded As UInteger = Await dataReader.LoadAsync(CUInt(size)) 
      Dim text As String = dataReader.ReadString(numBytesLoaded) 
      Using tr = New StringReader(text) 
       obj = x.Deserialize(tr) 
       Return obj 
      End Using 
      stream.Dispose() 
     End Using 
    Catch ex As Exception 
     Return Nothing 
    End Try 
    Return True 
End Function 

mia conclusione è che è che il. NET Il compilatore nativo tenta in realtà di serializzare qualsiasi tipo di codice che stai tentando di serializzare su qualsiasi oggetto stai tentando di serializzare. Nel mio caso il tipo era semplice come questo:

Public Class Result 
    Public Property ElementName As String 
    Public Property Id As Integer 
    Public Property Name As String 
End Class 
Public Class GetValues 
    Public Property Count As Integer 
    Public Property Message As String 
    Public Property SearchCriteria As String 
    Public Property Results As Result() 
End Class 

Tuttavia, queste stesse identiche funzioni non riescono a serializzare un oggetto con un contratto di dati da un servizio WCF. Quindi suppongo che forse debba essere una ObservableCollection del tuo tipo. Non l'ho ancora provato. Aggiornerò questo con la risposta.

Problemi correlati