XmlSerializer не может найти EntityObject, даже если на него ссылаются - PullRequest
2 голосов
/ 12 февраля 2009

Я надеюсь, что кто-то может помочь мне с этой проблемой, которая возникла у меня с XmlSerializer.

Я уже просматривал эту тему: http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/551cee76-fd80-48f8-ac6b-5c22c234fecf/

Я получаю ошибку:

System.InvalidOperationException: Невозможно создать временный класс (результат = 1). Ошибка CS0012: тип «System.Data.Objects.DataClasses.EntityObject» определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку 'System.Data.Entity, версия = 3.5.0.0, культура = нейтральная, 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 использует некоторые обобщения, но я украсил его XmlInclude для (EntityObject и любых других классов, на которые он ссылается).

телефонный код:

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

1020 * не может *

Однако, если я это сделаю:

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 

Опять любые мысли были бы велики

Ответы [ 4 ]

0 голосов
/ 11 июля 2014

Я понимаю, что это более старый вопрос, но для потомства установите параметр CopyLocal в ссылке .dll на True.

0 голосов
/ 12 февраля 2009

В итоге я удалил общий код, и он работал нормально.

0 голосов
/ 17 мая 2011

У меня тоже такая же проблема (в VB). я обнаружил, что вы можете использовать универсальный параметр, но он содержит ошибки, потому что тип MyEntityObjectSubClass находится в другой сборке. Если вы удалите ограничение типа для универсального параметра, он будет работать нормально.

Я считаю, что это ошибка в самой структуре. Я отправил тикет обратной связи на microsoft . Я прикрепил VB.net

0 голосов
/ 12 февраля 2009

Если у вас нет кода, требующего ссылки во время компиляции, тогда эта ссылка не будет включена в сборку. Вы можете использовать такой инструмент, как Reflector , чтобы проверить, попадает ли ссылка в вашу сборку.

Вы можете попробовать добавить статический метод к WantToSerialize, который создает XmlSerializer. Сборка, содержащая WantToSerialize, должна уже иметь хорошую ссылку на EntityObject, поэтому это должно решить проблему.

...