当我尝试运行以下代码时(两个分隔的程序集)
ClassLibrary.cs
public interface ITest
{
}
Program.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\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约束吗?
发布于 2010-03-01 23:57:21
我想你是运气不好。以下是微软对这个问题的回应:
谢谢你提交这个问题。不幸的是,我们决定不解决这一问题,因为修复的风险大于其好处。当下一个进行此更改的机会到来时,希望未来版本的中的新序列化技术将解决您的场景。如果此问题对业务造成重大负面影响,请与Microsoft产品支持服务联系。我感到遗憾的是,我们无法提供更好的解决办法。请放心,我们认真考虑了这个问题-一个不会修正的决定是从来不容易作出的。
这基本上意味着您应该使用DataContractSerializer而不是XmlSerializer,或者更改对象结构。
发布于 2010-03-04 10:09:34
实际上,你可能很亲密,甚至都不知道。
尝试在ClassLibrary程序集中定义一个空助手类,并将[Serializable, XmlInclude(SerializationReferenceHelper)]
放在public class TestClass
之上。
问题是Xml解析器不知道第二个类,因为它位于不同的程序集中,并且仅由代码中的where约束引用。是的,微软可以写一些小调来查看所有已知的程序集.不知道他们为什么不这么做。但就目前而言,这可能行得通。
ClassLibrary
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));
}
}
发布于 2010-03-01 23:47:50
类型ITest是在未引用的程序集中定义的。必须添加对程序集ClassLibrary的引用。
你做过这个吗?
https://stackoverflow.com/questions/2361563
复制相似问题