Подскажите пожалуйста что я делаю не так...
есть такие классы:
[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'>."
But beauty, real beauty, ends where an intellectual expression begins... OW
Здравствуйте, 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'>."
А откуда же десериализатор должен узнать про реальную имплементацию MyClassA? Вместо [XmlIncludeAbstractAttribute(typeof(MyClassA))] передай сериализатору в конструкторе в качестве extra types TypeAccessor<MyClassA>.Type. Теоретически, должно получиться.
Здравствуйте, 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'>."
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
Здравствуйте, 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'>."
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