【发布时间】: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