2011-10-05 79 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中