Самое безопасное место для XmlSerializer для сохранения временных файлов
До меня дошло, что 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
также требуется место на диске таким же образом?
1 ответ
DataContractSerializer, NetDataContractSerializer и DataContractJsonSerializer будут хорошей альтернативой для вас. Они НЕ требуют дискового пространства и НЕ выпускают сборки на диск. Вместо этого они генерируют IL на лету (в памяти) и используют его во время последующих эпизодов сериализации, чтобы выполнять сериализацию и десериализацию всего в пределах AppDomain, в котором они работают. XmlSerializer действительно требует дискового пространства, как вы выяснили. С другой стороны, вам не нужно менять какие-либо типы - просто замените сериализатор, и все будет хорошо, поскольку DataContractSerializer поддерживает форматы сериализации, модели и парадигмы всех других сериализаторов, которые когда-либо поставляла Microsoft. в.NET