2 Stimmen

XmlSerializer kann EntityObject nicht finden, obwohl es referenziert wird

Ich hoffe, dass jemand mir bei diesem Problem helfen kann, das ich mit XmlSerializer habe.

Ich habe diesen Thread bereits durchgelesen: http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/551cee76-fd80-48f8-ac6b-5c22c234fecf/

Der Fehler, den ich erhalte, lautet:

System.InvalidOperationException: Es konnte keine temporäre Klasse erzeugt werden (result=1). Fehler CS0012: Der Typ 'System.Data.Objects.DataClasses.EntityObject' ist in einer Assembly definiert, die nicht referenziert ist. Sie müssen einen Verweis auf die Assembly 'System.Data.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' hinzufügen.

Ich habe sichergestellt, dass mein Unit-Test einen Verweis auf System.Data.Entity hat, so dass es in der Lage, zumindest zu kompilieren ist. Ich habe auch in der app.config eine Assembly-Bindung an System.Data.Entity vorgenommen.

Hier ist meine grobe Klassenstruktur

[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
}

Die WantToSerializeBaseClass nutzt einige Generika, aber ich habe sie mit XmlIncludes für (EntityObject und alle anderen Klassen, auf die sie verweist, sowie) dekoriert.

den aufrufenden Code:

var serializerWrite = new XmlSerializer(typeof (WantToSerialize), XmlSupport.ITNNamespace); 

scheitert

Aber wenn ich es tue:

var serializerWrite = new XmlSerializer(typeof (WantToSerialize), new Type[] {typeof(EntityObject)}); 

es ist erfolgreich.

Jeder Gedanke wäre sehr hilfreich.

AKTUALISIERT Ich habe das Problem auf eine Methode in der WantToSerializeBaseClass zurückgeführt

public abstract void ConvertFromEntity<TtoCopy>(TtoCopy toCopy) where TtoCopy : MyEntityObjectSubClass;

MyEntityObjectSubClass ist eine Unterklasse von EntityObject, die einige Methoden hinzufügt, die ich für meine Entitätsobjekte benötige. Die MyEntityObjectSubClass sieht wie folgt aus:

[Serializable]
[XmlInclude(typeof(EntityObject))]
public abstract class MyEntityObjectSubClass : EntityObject, IMyEntityObjectSubClass 

Auch hier wäre jeder Gedanke großartig

0voto

Dave Punkte 4340

Wenn Sie keinen Code haben, der einen Verweis zur Kompilierzeit erfordert, wird dieser Verweis nicht in die erstellte Baugruppe aufgenommen. Sie können ein Werkzeug wie Reflektor um zu prüfen, ob der Verweis in Ihre Baugruppe aufgenommen wird.

Eine Sache, die Sie versuchen können, ist das Hinzufügen einer statischen Methode zu WantToSerialize, die den XmlSerializer erstellt. Die Assembly, die WantToSerialize enthält, muss bereits einen guten Verweis auf EntityObject haben, so dass dies das Problem lösen sollte.

0 Stimmen

Ich habe Reflektor verwendet, um die DLL zu öffnen und sichergestellt, dass es einen Verweis auf System.Data.Entity (und seine die richtige Version) hat. Ich glaube nicht, dass das Hinzufügen einer statischen Methode, die XmlSerializer erstellt, eine Option ist, da ich es schließlich über das Kabel mit WCF senden möchte.

0voto

MisterHux Punkte 140

Ich habe dann den allgemeinen Code entfernt, und es hat geklappt.

0voto

Kratz Punkte 4240

Ich habe das gleiche Problem zu (in VB). was ich fand, ist, dass Sie den generischen Parameter verwenden können, aber es Fehler, weil der Typ MyEntityObjectSubClass in einer anderen Assembly ist. Wenn Sie die Typbeschränkung für den generischen Parameter aufheben, funktioniert es gut.

Ich glaube, dass dies ein Fehler in der Rahmenregelung selbst ist. Ich habe ein Feedback-Ticket eingereicht an microsoft . Ich habe eine VB.net

0voto

kozmi Punkte 25

Ich weiß, dass dies eine ältere Frage ist, aber der Nachwelt zuliebe setzen Sie den CopyLocal-Parameter für den .dll-Verweis auf True.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X