4

我注意到 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也以相同的方式需要磁盘空间?

4

1 回答 1

3

DataContractSerializer、NetDataContractSerializer 和 DataContractJsonSerializer 对您来说都是不错的选择。它们不需要磁盘空间,也不会将程序集发送到磁盘。相反,它们在运行中(在内存中)生成 IL,并在随后的序列化情节中使用它在它们正在运行的 AppDomain 中进行序列化和反序列化。正如您所发现的,XmlSerializer 确实需要磁盘空间。从好的方面来说,您不需要更改任何类型 - 只需替换序列化程序就可以了,因为 DataContractSerializer 支持 Microsoft 已发布的所有其他序列化程序的序列化格式、模型和范例在 .NET 中

于 2012-04-26T19:34:29.040 回答