Самое безопасное место для XmlSerializer для сохранения временных файлов - PullRequest
4 голосов
/ 05 октября 2011

Мне стало известно, что 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 Ответ

3 голосов
/ 26 апреля 2012

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

...