我注意到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
是否也以相同的方式需要磁盘空间?
答案 0 :(得分:3)
DataContractSerializer,NetDataContractSerializer和DataContractJsonSerializer都将是您的不错选择。它们不需要磁盘空间,也不会将组件发送到磁盘。相反,它们在运行中(在内存中)生成IL并在后续序列化事件中使用它来在它们正在运行的AppDomain中进行序列化和反序列化.XmlSerializer确实需要磁盘空间,正如您所发现的那样。从好的方面来说,您不需要更改任何类型 - 只需更换序列化程序就可以了,因为DataContractSerializer支持Microsoft发布的所有其他序列化程序的序列化格式,模型和范例在.NET中