【问题标题】:UWP with xmlSerializer - System.InvalidOperationException: Unable to generate a temporary class (result=1) compile error带有 xmlSerializer 的 UWP - System.InvalidOperationException:无法生成临时类(结果 = 1)编译错误
【发布时间】:2016-04-21 04:50:27
【问题描述】:

在我的通用 Windows 应用程序中,我存储用户数据,通过 XmlSerializer 将其对象转换为 xml 文件。

应用程序正在完美地编译、构建和运行,直到不知何故(对代码没有任何更改)发布的构建开始给我这个错误:System.InvalidOperationException: Unable to generate一个临时类 (result=1)

如果我在调试时构建或运行应用程序,它可以完美运行,但在发布时(.NET 本机工具链处于活动状态)我会收到错误。

我已经向所有人授予了 C:\Windows\Temp 文件夹的权限。甚至我的母亲也可以访问它,但错误仍然存​​在。

如果真的是 XmlSerializer 上的读/写问题,我想知道是否有任何方法可以更改 UWP 项目上的序列化器临时文件夹

这是我用来序列化对象的代码:

    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;
    }

我错过了什么?有人可以帮忙吗?

【问题讨论】:

  • 如果开启诊断级别日志记录,可能会有更多线索。如果这没有说明,请随时通过 dotnetnative@microsoft.com 给我们发邮件。并不是说因为 MLK 节假期,人们要到周二才能到办公室。
  • 我认为在您的情况下,执行 T temp = default(T) 将使用反射,并且 .NET Native 编译器将尝试构建“temp”对象来保存它需要序列化或反序列化的任何数据,但一无所知,导致了KABOOM。 obj.GetType 会在 VB.net 中为我执行此操作。在不创建默认类型的情况下将那个坏男孩变成一个变体,我认为你会没事的。

标签: c# .net xml-serialization uwp .net-native


【解决方案1】:

我对这个几乎相同的代码有完全相同的错误:

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

我的结论是,.NET Native 编译器实际上会尝试序列化您尝试序列化的任何类型,以序列化您尝试使用该代码序列化的任何对象。就我而言,类型是这样的简单类型:

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

但是,这些完全相同的函数在序列化具有来自 WCF 服务的数据协定的对象时不会失败。所以我想也许它需要是你类型的 ObservableCollection。我还没有尝试过。我会用答案更新这个。

【讨论】:

    【解决方案2】:

    只是来这里帮助遇到此问题的任何其他人。似乎当 .NET native 编译时,如果您的类将被 Xml 序列化/反序列化,其中包含对 Horizo​​ntalAlignment 和 VerticalAlignment 等内容的引用,那么您将遇到问题。真的很烦人,我目前正在使用 Visual Studio Update 3,但我仍然遇到这个问题。

    有关更好的解释,请参阅此堆栈溢出答案:

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

    【讨论】:

      【解决方案3】:

      您是否引用了带有“添加为链接”的 XML 序列化文件的项目? (在我的情况下导致上述错误的原因)在这种情况下,这里是......

      ...解决方案:

      显然,您仍然可以使用“添加为链接”的代码共享方式,但是为了启用“使用 .NET Native 工具链编译”而不出现任何那些晦涩的无关错误,“添加为链接” ”文件需要移动到调用者项目中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多