XML deserializing embedded abstr. classes
От: Alex De Kleine  
Дата: 27.05.08 15:59
Оценка:
Подскажите пожалуйста что я делаю не так...
есть такие классы:

[XmlRoot(Namespace = "urn:abstr"), XmlType(Namespace = "urn:abstr")]
public abstract class MyClassA
{
public abstract string ValueA { get; set; }

}

[XmlRoot(Namespace="urn:abstr"), XmlType(Namespace="urn:abstr")]
[XmlIncludeAbstractAttribute(typeof(MyClassA))]
public abstract class MyClassB
{
public abstract string ValueB { get; set; }
public abstract MyClassA ValueMyClassA { get; set; }

public abstract EditableList<MyClassA> MyList { get; set; }

}

Создаю экземпляр и сериализую вроде нормально, но когда десериализую полученную строку обратно, получаю такую ошибку:

"System.InvalidOperationException : There is an error in XML document (4, 4).
----> System.InvalidOperationException : The specified type is abstract: name='MyClassA', namespace='urn:abstr', at <ValueMyClassA xmlns='urn:abstr'&gt;."
But beauty, real beauty, ends where an intellectual expression begins... OW
Re: XML deserializing embedded abstr. classes
От: Andy77 Ниоткуда  
Дата: 27.05.08 19:38
Оценка:
Здравствуйте, Alex De Kleine, Вы писали:

ADK>Создаю экземпляр и сериализую вроде нормально, но когда десериализую полученную строку обратно, получаю такую ошибку:


ADK>"System.InvalidOperationException : There is an error in XML document (4, 4).

---->> System.InvalidOperationException : The specified type is abstract: name='MyClassA', namespace='urn:abstr', at <ValueMyClassA xmlns='urn:abstr'&gt;."

А откуда же десериализатор должен узнать про реальную имплементацию MyClassA? Вместо [XmlIncludeAbstractAttribute(typeof(MyClassA))] передай сериализатору в конструкторе в качестве extra types TypeAccessor<MyClassA>.Type. Теоретически, должно получиться.
Re[2]: XML deserializing embedded abstr. classes
От: Alex De Kleine  
Дата: 27.05.08 20:44
Оценка:
Здравствуйте, Andy77, Вы писали:

A>Здравствуйте, Alex De Kleine, Вы писали:


ADK>>Создаю экземпляр и сериализую вроде нормально, но когда десериализую полученную строку обратно, получаю такую ошибку:


ADK>>"System.InvalidOperationException : There is an error in XML document (4, 4).

---->>> System.InvalidOperationException : The specified type is abstract: name='MyClassA', namespace='urn:abstr', at <ValueMyClassA xmlns='urn:abstr'&gt;."

A>А откуда же десериализатор должен узнать про реальную имплементацию MyClassA? Вместо [XmlIncludeAbstractAttribute(typeof(MyClassA))] передай сериализатору в конструкторе в качестве extra types TypeAccessor<MyClassA>.Type. Теоретически, должно получиться.


Именно так я серилизатор и создаю. И, скажем так, с простыми абстрактными классами не было проблемы. Серилизуются туда-суда прекрасно. Захотелось теперь и вложенные классы. XmlIncludeAbstractAttribute вроде раз для этого и сделан. Как я понял он необходим что бы серилизовать абстрактный класс с вложенным абстрактным классом. он, я так понял, TypeAccessor.GetAccessor(type).Type использует, что бы знать type.... или я где то торможу???? Cтранно, что серилизация работает. т.е я получаю с виду красивый хмл с вложенным классом и листом. Т.е. серилизатор о всё классе знает! А вот этот же хмл назад в объект не получается или я рассуждаю не правильно???
But beauty, real beauty, ends where an intellectual expression begins... OW
Re[3]: XML deserializing embedded abstr. classes
От: Alex De Kleine  
Дата: 27.05.08 21:06
Оценка:
Здравствуйте, Alex De Kleine, Вы писали:

ADK>Здравствуйте, Andy77, Вы писали:


A>>Здравствуйте, Alex De Kleine, Вы писали:


ADK>>>Создаю экземпляр и сериализую вроде нормально, но когда десериализую полученную строку обратно, получаю такую ошибку:


ADK>>>"System.InvalidOperationException : There is an error in XML document (4, 4).

---->>>> System.InvalidOperationException : The specified type is abstract: name='MyClassA', namespace='urn:abstr', at <ValueMyClassA xmlns='urn:abstr'&gt;."

A>>А откуда же десериализатор должен узнать про реальную имплементацию MyClassA? Вместо [XmlIncludeAbstractAttribute(typeof(MyClassA))] передай сериализатору в конструкторе в качестве extra types TypeAccessor<MyClassA>.Type. Теоретически, должно получиться.


ADK>Именно так я серилизатор и создаю. И, скажем так, с простыми абстрактными классами не было проблемы. Серилизуются туда-суда прекрасно. Захотелось теперь и вложенные классы. XmlIncludeAbstractAttribute вроде раз для этого и сделан. Как я понял он необходим что бы серилизовать абстрактный класс с вложенным абстрактным классом. он, я так понял, TypeAccessor.GetAccessor(type).Type использует, что бы знать type.... или я где то торможу???? Cтранно, что серилизация работает. т.е я получаю с виду красивый хмл с вложенным классом и листом. Т.е. серилизатор о всё классе знает! А вот этот же хмл назад в объект не получается или я рассуждаю не правильно???


Type[] extraTypes = new Type[1];
extraTypes[0] = TypeAccessor<MyClassA>.Type;
XmlSerializer srMcb = new XmlSerializer(TypeAccessor<MyClassB>.Type, extraTypes);

не помогло
But beauty, real beauty, ends where an intellectual expression begins... OW
Re: XML deserializing embedded abstr. classes
От: Блудов Павел Россия  
Дата: 28.05.08 04:07
Оценка:
Здравствуйте, Alex De Kleine, Вы писали:

Добавил тест:
http://bl-toolkit.googlecode.com/svn/trunk/HowTo/TypeBuilder/XmlSerialization.cs
отрабатывает на ура.

Похоже это старая добрая ошибка
Автор: Блудов Павел
Дата: 03.04.08
XmlSerializer'а.
... << RSDN@Home 1.2.0 alpha 2 rev. 872>>
Re[2]: XML deserializing embedded abstr. classes
От: Alex De Kleine  
Дата: 28.05.08 08:19
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, Alex De Kleine, Вы писали:


БП>Добавил тест:

БП>http://bl-toolkit.googlecode.com/svn/trunk/HowTo/TypeBuilder/XmlSerialization.cs
БП>отрабатывает на ура.

БП>Похоже это старая добрая ошибка
Автор: Блудов Павел
Дата: 03.04.08
XmlSerializer'а.


Спасибо большущее!
But beauty, real beauty, ends where an intellectual expression begins... OW
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.