代码之家  ›  专栏  ›  技术社区  ›  Martin

使用泛型类型约束时,XmlSerializer正在引发InvalidOperationException,其中

  •  7
  • Martin  · 技术社区  · 15 年前

    当我尝试运行以下代码时(两个分离的程序集)

    类图书馆

    public interface ITest
    {
    }
    

    程序CS

    using System;
    
    public class TestClass
    {
        public void Test<T>(T x) where T : ITest { }
    }
    
    static class Program
    { 
        static void Main(string[] args)         
        {
            new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
        }
    }
    

    使用以下命令在Windows 7 64位中编译:

    C:\windows\microsoft.net\framework\v2.0.50727\cs c/target:library classlibrary.cs

    C:\windows\microsoft.net\framework\v2.0.50727\cs c/reference:classlibrary.dll program.cs

    我得到这个例外:

    System.InvalidOperationException:无法生成临时类 (结果=1)。错误CS0012:类型 ITest是在一个程序集中定义的, 未引用。您必须添加 引用程序集类库, 版本=0.0.0.0,区域性=中性, publicKeyToken=空hinzu。

    在 system.xml.serialization.compiler.compile(程序集 父级,字符串ns, XML序列化编译器参数 XML参数,证据证据)
    在 system.xml.serialization.tempassembly.generateassembly(xmlmapping[] XmlMappings,类型[]类型,字符串 defaultnamespace,证据证据, XML序列化编译器参数 参数,装配组件, 哈希表程序集)位于 system.xml.serialization.tempassembly..ctor(xml映射[] XmlMappings,类型[]类型,字符串 默认命名空间,字符串位置, 证据证据) system.xml.serialization.xmlserializer.generatetempassembly(xmlmmapping XML映射,类型类型,字符串 defaultnamespace)位于 system.xml.serialization.xmlserializer..ctor(类型 类型,字符串defaultnamespace)位于 program.main(字符串[]个参数)

    去掉 其中T:ITEST 测试类 或者根本不使用仿制药(例如使用 公共空隙测试(ITest x) )将防止抛出异常,但我需要在实际应用程序中使用此构造。

    有人知道为什么XmlSerializer无法处理Where约束吗?

    3 回复  |  直到 14 年前
        1
  •  6
  •   Darin Dimitrov    15 年前

    我想你是 out of luck . 以下是微软对此问题的回应:

    感谢您提交此问题。 不幸的是,我们决定 不会被解决,因为风险 修复的好处大于它的好处。通过 下一次有机会 这种变化发生了,希望是 新的序列化 未来版本的技术 Windows通信基金会 将解决您的方案。如果这样 问题造成重大负面影响 业务影响,请联系 Microsoft产品支持服务。我 很遗憾我们不能提供 更好的分辨率。放心吧 我们认真考虑了这个问题-a 不解决问题决不容易 制造。

    这基本上是说你应该使用 DataContractSerializer 而不是 XmlSerializer 或者更改对象结构。

        2
  •  3
  •   Martin    14 年前

    实际上,你可能离得很近,甚至不知道。

    尝试在类库程序集中定义一个空的助手类,并将其 [Serializable, XmlInclude(SerializationReferenceHelper)] 就在上面 public class TestClass .

    问题是XML解析器不知道第二个类,因为它在不同的程序集中,并且只被代码中的where约束引用。是的,微软可以写一些小调来查找所有已知的程序集…不知道他们为什么不这样做。但现在这可能行得通。

    类别库

    public class SerializationReferenceHelper { }
    public interface ITest { }
    

    程序

    [Serializable, XmlInclude(typeof(SerializationReferenceHelper))]
    public class TestClass
    {
        public void Test<T>(T x) where T : ITest { }
    }
    
    static class Program
    { 
        static void Main(string[] args)         
        {
            new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
        }
    }
    
        3
  •  -3
  •   Webleeuw    15 年前

    ITest类型是在 未引用的程序集。 你 必须添加对程序集的引用 类别库

    你做到了吗?