首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当使用泛型类型约束时,XmlSerializer将抛出InvalidOperationException

当使用泛型类型约束时,XmlSerializer将抛出InvalidOperationException
EN

Stack Overflow用户
提问于 2010-03-02 07:45:12
回答 3查看 3.9K关注 0票数 7

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

ClassLibrary.cs

代码语言:javascript
代码运行次数:0
运行
复制
public interface ITest
{
}

Program.cs

代码语言:javascript
代码运行次数:0
运行
复制
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\csc /target:library ClassLibrary.cs c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc /reference:ClassLibrary.dll Program.cs

我得到了这个例外:

System.InvalidOperationException:无法生成临时类(result=1)。错误CS0012: ITest类型是在未引用的程序集中定义的。您必须添加对程序集ClassLibrary、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null hinzu的引用。 在System.Xml.Serialization.Compiler.Compile(Assembly父母,字符串ns,XmlSerializerCompilerParameters xmlParameters,证据) 在System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] System.Xml.Serialization.TempAssembly..ctor(XmlMapping[]中,Type[]类型、String defaultNamespace、证据证据、XmlSerializerCompilerParameters参数、程序集、哈希表程序集)在System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings,Type[]类型、字符串defaultNamespace、字符串位置、证据)在System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping,类型,字符串defaultNamespace)在System.Xml.Serialization.XmlSerializer..ctor(Type类型,字符串defaultNamespace) at Program.Main(String[] args)

将where : ITest从TestClass中删除或根本不使用泛型(例如使用公共空测试(ITest x))将防止抛出异常,但我需要在实际应用程序中使用此构造。

有人知道为什么XmlSerializer不能处理where约束吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-02 07:57:21

我想你是运气不好。以下是微软对这个问题的回应:

谢谢你提交这个问题。不幸的是,我们决定不解决这一问题,因为修复的风险大于其好处。当下一个进行此更改的机会到来时,希望未来版本的中的新序列化技术将解决您的场景。如果此问题对业务造成重大负面影响,请与Microsoft产品支持服务联系。我感到遗憾的是,我们无法提供更好的解决办法。请放心,我们认真考虑了这个问题-一个不会修正的决定是从来不容易作出的。

这基本上意味着您应该使用DataContractSerializer而不是XmlSerializer,或者更改对象结构。

票数 6
EN

Stack Overflow用户

发布于 2010-03-04 18:09:34

实际上,你可能很亲密,甚至都不知道。

尝试在ClassLibrary程序集中定义一个空助手类,并将[Serializable, XmlInclude(SerializationReferenceHelper)]放在public class TestClass之上。

问题是Xml解析器不知道第二个类,因为它位于不同的程序集中,并且仅由代码中的where约束引用。是的,微软可以写一些小调来查看所有已知的程序集.不知道他们为什么不这么做。但就目前而言,这可能行得通。

ClassLibrary

代码语言:javascript
代码运行次数:0
运行
复制
public class SerializationReferenceHelper { }
public interface ITest { }

程序

代码语言:javascript
代码运行次数:0
运行
复制
[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
EN

Stack Overflow用户

发布于 2010-03-02 07:47:50

类型ITest是在未引用的程序集中定义的。必须添加对程序集ClassLibrary的引用。

你做过这个吗?

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2361563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档