【发布时间】:2011-10-05 11:16:59
【问题描述】:
我注意到 XmlSerializer 需要使用磁盘空间来进行竞标。如果没有可写的 %temp% 文件夹,则失败并显示如下错误:
Source : System.Xml Message : Unable to generate a temporary class (result=1). error CS2001: Source file 'C:\Windows\TEMP\c1ls4elp.0.cs' could not be found error CS2008: No inputs specified StackTrace : at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence) at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies) at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace) at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) at StreamLib.Tuna.SerializationHelper.Deserialize[T](String presetsString) ...
作为参考,StreamLib.Tuna.SerializationHelper.Deserialize[T] 的实现如下所示:
public static T Deserialize<T>(this string data) where T:class
{
var type = typeof(T);
XmlSerializer serializer = new XmlSerializer(type);
using (TextReader reader = new StringReader(data))
{
try
{
return (T)serializer.Deserialize(reader);
}
catch
{
return null;
}
}
}
我认为最好留给用户更改文件夹的权限,而不是为狡猾的序列化程序提供补丁,所以我想通过将序列化程序放在其他地方来编写它的废话来解决这个问题。这可以通过将以下内容添加到app.config/web.config 来实现:
<system.xml.serialization>
<xmlSerializer tempFilesLocation="c:\\foo"/>
</system.xml.serialization>
我的问题是,此设置是否有防弹位置使用,不会在某些客户端计算机上失败?如果没有,我的替代方案是什么? DataContractJsonSerializer 是否也同样需要磁盘空间?
【问题讨论】:
-
我认为最好的方法是当前用户的临时文件夹。这应该始终是可写的。
标签: c# xmlserializer datacontractjsonserializer