我希望有人可以帮我解决我在XmlSerializer上遇到的这个问题。
我得到的错误是:
System.InvalidOperationException:无法生成临时类(result = 1)。 错误CS0012:类型'System.Data.Objects.DataClasses.EntityObject'在未引用的程序集中定义。您必须添加对程序集'System.Data.Entity,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的引用。
我已确保我的单元测试具有对System.Data.Entity的引用,因此它至少可以编译。我也在app.config中创建了一个绑定到System.Data.Entity的程序集。
这是我粗略的班级结构
[Serializable]
[XmlRoot(Namespace = XmlSupport.MyNamespace, ElementName = XmlSupport.WantToSerialize)]
[XmlInclude(typeof(WantToSerializeBaseClass)]
[XmlInclude(typeof(EntityObject)]
[XmlInclude(typeof(MyEntityObjectSubClass)]
public class WantToSerialize : WantToSerializeBaseClass, IXmlSerializable (I've tried putting this on the baseclass and the current class)
{
// methods and classes
// I've included XmlIncludes for all the classes that this class has a reference too
// even though in the WriteXml it just uses .NET base classes
}
WantToSerializeBaseClass使用了一些泛型,但我用XmlIncludes(EntityObject,以及它引用的任何其他类)来装饰它。
主叫代码:
var serializerWrite = new XmlSerializer(typeof (WantToSerialize), XmlSupport.ITNNamespace);
失败
但是,如果我这样做:
var serializerWrite = new XmlSerializer(typeof (WantToSerialize), new Type[] {typeof(EntityObject)});
它是成功的。
任何想法都会有所帮助。
已更新 我已将问题跟踪到WantToSerializeBaseClass
中的方法public abstract void ConvertFromEntity<TtoCopy>(TtoCopy toCopy) where TtoCopy : MyEntityObjectSubClass;
MyEntityObjectSubClass是EntityObject的子类,它在我的实体对象上添加了一些我想要的方法。 MyEntityObjectSubClass看起来像这样:
[Serializable]
[XmlInclude(typeof(EntityObject))]
public abstract class MyEntityObjectSubClass : EntityObject, IMyEntityObjectSubClass
再一次,任何想法都会很棒
答案 0 :(得分:0)
如果在编译时没有任何需要引用的代码,那么该引用将不会包含在构建的程序集中。您可以使用Reflector之类的工具来检查引用是否正在进入程序集。
您可以尝试的一件事是为WantToSerialize添加静态方法,以创建XmlSerializer。包含WantToSerialize的程序集必须已经具有对EntityObject的良好引用,因此这应该可以解决问题。
答案 1 :(得分:0)
我最终删除了通用代码并且工作正常。
答案 2 :(得分:0)
我也有同样的问题(在VB中)。我发现你可以使用泛型参数,但它是错误的,因为MyEntityObjectSubClass类型在另一个程序集中。如果删除泛型参数的类型限制,它将正常工作。
我认为这是框架本身的一个错误。我已向microsoft提交了反馈票。我附上了一个VB.net
答案 3 :(得分:0)
我意识到这是一个较旧的问题但是为了后人的缘故,将.dll引用上的CopyLocal参数设置为True。