Самое безопасное место для 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 дискового пространства таким же образом?


person spender    schedule 05.10.2011    source источник
comment
Я думаю, что лучшим способом будет временная папка текущего пользователя. Это всегда должно быть доступно для записи.   -  person Daniel Hilgarth    schedule 05.10.2011


Ответы (1)


DataContractSerializer, NetDataContractSerializer и DataContractJsonSerializer будут хорошими альтернативами для вас. Они НЕ требуют места на диске и НЕ создают сборки на диск. Вместо этого они генерируют IL «на лету» (в памяти) и используют его во время последующих эпизодов сериализации для выполнения сериализации и десериализации всего домена приложения, в котором они работают. XmlSerializer, как вы выяснили, требует дискового пространства. С положительной стороны, вам не нужно менять какие-либо из ваших типов — просто замените сериализатор, и все будет готово, поскольку DataContractSerializer поддерживает форматы сериализации, модели и парадигмы всех других сериализаторов, которые Microsoft когда-либо поставляла. в .NET

person krisragh MSFT    schedule 26.04.2012