2010-02-02 3 views
2

Я работаю над системой перетаскивания для моего приложения WPF.C# - десериализовать класс с внутренним конструктором

Путь это работает:

  1. Я принимаю перетаскиваемый элемент
  2. Сериализация это XML
  3. Когда он потеряется я десериализации его снова.

Это отлично работает в моем тестовом приложении. Однако теперь, когда я пытаюсь сделать это в своем реальном приложении, я попал в ловушку. Класс, который я пытаюсь десериализовать (Microsoft.TeamFoundation.WorkItemTracking.Client.FieldDefinition), не имеет открытого конструктора.

Когда я пытаюсь десериализации его, используя этот код:

XmlReader reader = XmlReader.Create(new StringReader(xamlString)); 
object elt = XamlReader.Load(reader); 

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

 
Cannot create object of type 
'Microsoft.TeamFoundation.WorkItemTracking.Client.FieldDefinition'. 
CreateInstance failed, which can be caused by not having a public default 
constructor for 'Microsoft.TeamFoundation.WorkItemTracking.Client.FieldDefinition 

Am I тоста? Есть ли способ десериализовать этот класс? Любые другие идеи о том, как передать этот класс с помощью перетаскивания? (Я использую FluidKit Drag and Drop Advisers.)

ответ

3

Я работал с классом FieldDefinition совсем немного, и наименьшая из проблем, с которой вы столкнетесь с сериализацией XML, - это внутренний конструктор. Это очень сложный тип, который обычно ссылается (косвенно) на значения COM и несколько GC-ручек. Просто не упростить сериализацию экземпляров типа.

Что вы можете сделать, хотя и сериализуете ReferenceName FieldDefinition. Затем вы можете использовать это для восстановления объекта FieldDefinition в более поздней точке.

+0

Хорошая идея! Я пойду с этим. Спасибо за совет. – Vaccano