2011-10-05 40 views
4

我注意到XmlSerializer需要使用磁盘空间来执行其出价。如果没有写入%temp%文件夹,然后将其失败,错误如下:XmlSerializer保存临时文件的最安全位置

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

更改文件夹的权限是我认为最好留给用户的,而不是针对不友好的序列化程序的修补程序,所以我想通过将序列化程序放在其他地方来编写它的废话来解决问题。

<system.xml.serialization> 
    <xmlSerializer tempFilesLocation="c:\\foo"/> 
</system.xml.serialization> 

我的问题是,是否有防弹位置使用此设置,将不会在某些客户端机器失败:这可以通过将下面以app.config/web.config实现?如果不是,我的替代品是什么? DataContractJsonSerializer是否也需要使用相同的磁盘空间?

+3

我认为最好的方式将是当前用户的临时文件夹。这应该始终是可写的。 –

回答

3

DataContractSerializer,NetDataContractSerializer和DataContractJsonSerializer都可以替代您。它们不需要磁盘空间,也不会将组件发送到磁盘。相反,它们在运行中(在内存中)生成IL,并在后续的序列化事件中使用它来执行序列化和反序列化,这些操作都在它们所在的AppDomain中进行.XmlSerializer确实需要磁盘空间,正如您发现的那样。另一方面,您不需要更改任何类型 - 只需替换序列化程序即可,因为DataContractSerializer支持Microsoft发布的所有其他序列化程序的序列化格式,模型和范例在.NET中