Здравствуйте, Torinous, Вы писали:
T>Здравствуйте, stump, Вы писали:
S>>Здравствуйте, Torinous, Вы писали:
S>>Что ты в прятки играешь. Тебе проблему решить надо или просто пообщаться хочется? S>>Покажи xml и exception.
T>Просто мне нужно снова переписывать код в неработающем виде чтобы показать. T>Да и ничего это не даст, ошибка что-то вроде Wrong XML data и два числа указывающие на символ перевод строки после первой строчки XML файла.
T> V — сюда. T><?xml version="1.0" encoding="iso-8859-1"?> T><pnml>...
T>Всё это нужно для десереализации сереализация как таковая меня не интересует.
T> PS. А тебе что пообщаться влом. T> PPS. Кстати почему сменилась тема?
Общаться мне не влом, просто времени мало, да и стоит оно у меня достаточно дорого. Тем не менее считаю что людям надо помогать. А отстутствие достаточно информации мешает это сделать.
По существу вопроса.
Тебе надо копать в направлении аттрибутов XmlIncludeAttribute и XmlRootAttribute.
XmlIncludeAttribute используется для указания наследников данного класса которые могут быть десериализованы. В твоих терминах этот атрибут надо повесить над классом А и указать в нем тип класса В.
Можно попробовать тупо повесить атрибут XmlRootAttribute над классом В и прописать в нем имя xml элемента который надо десериализовать (поскольку надо полагать имя класса и имя xml у тебя не совпадают).
Здравствуйте, <Аноним>, Вы писали:
А>Есть сеpеализyемый класс A, сеpеализyется и де- на ypа. А>Я желаю pасшиpить его фyнкциональность интеpфейсом, но не хочy пpавить его А>самого. Делаю так
А>public class B: A, IInterface А>{ А>//pеализация методов интеpфейса А>}
А>Ожидаю что B бyдет десеpеализоваться так же как A, но не тyт-то было. А>Полyчаю ошибкy в фоpмате XML файла. В чём косяк?
SerializableAttribute не наследуется. Тебе нужно помечать и дочерние классы:
Здравствуйте, <Аноним>, Вы писали:
А>Есть сеpеализyемый класс A, сеpеализyется и де- на ypа. А>Я желаю pасшиpить его фyнкциональность интеpфейсом, но не хочy пpавить его А>самого. Делаю так
[c#]
А>public class B: A, IInterface
А>{
А>//pеализация методов интеpфейса
А>}
[/c#]
А>Ожидаю что B бyдет десеpеализоваться так же как A, но не тyт-то было. А>Полyчаю ошибкy в фоpмате XML файла. В чём косяк?
Открытый конструктор без параметров в классе B остался? Открытые свойства новые (по-сравнению с A) появились? Покажи пример вызова XmlSerializer?
... << RSDN@Home 1.2.0 alpha rev. 650>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Аноним, Вы писали:
А>Есть сеpеализyемый класс A, сеpеализyется и де- на ypа. А>Я желаю pасшиpить его фyнкциональность интеpфейсом, но не хочy пpавить его А>самого. Делаю так
А>public class B: A, IInterface А>{ А>//pеализация методов интеpфейса А>}
А>Ожидаю что B бyдет десеpеализоваться так же как A, но не тyт-то было. А>Полyчаю ошибкy в фоpмате XML файла. В чём косяк?
1) Ты пытаешься десериализовать старый файл, созданный без интерфейса
2) Ты испортил файл(попробуй открой в Експлорере, ругаться не должен
3) Ты пытаешься десериализовать файл, не определив сеттеры в интерфейсе и самом классе
4) Ты не определил открытого конструктора в классе A(он должен быть без параметров вроде бы...)
5) еще что-то... Пиши ексепшн :)
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, <Аноним>, Вы писали:
А>>Есть сеpеализyемый класс A, сеpеализyется и де- на ypа. А>>Я желаю pасшиpить его фyнкциональность интеpфейсом, но не хочy пpавить его А>>самого. Делаю так
_FR>[c#] _FR>
А>>public class B: A, IInterface
А>>{
А>>//pеализация методов интеpфейса
А>>}
_FR>
_FR>[/c#]
А>>Ожидаю что B бyдет десеpеализоваться так же как A, но не тyт-то было. А>>Полyчаю ошибкy в фоpмате XML файла. В чём косяк?
_FR>Открытый конструктор без параметров в классе B остался? Открытые свойства новые (по-сравнению с A) появились? Покажи пример вызова XmlSerializer?
Нет класс B реально выглядит как я написал, ничего кроме трёх методов интерфейса.
Класс A это куча вложенных классов полученная с помощью xsd.exe.
ptnet.pnml net1 = new ptnet.pnml();
XmlSerializer formatter = new XmlSerializer(net1.GetType());
XmlTextReader tr = new XmlTextReader( new StringReader(PNMLFile.DocumentElement.OwnerDocument.OuterXml));
net1 = (ptnet.pnml)formatter.Deserialize(tr);
где ptnet.pnml это класс A, я расчитывал что при замене на B всё также заработает, но...
Здравствуйте, lonli, Вы писали:
L>Здравствуйте, Аноним, Вы писали:
А>>Есть сеpеализyемый класс A, сеpеализyется и де- на ypа. А>>Я желаю pасшиpить его фyнкциональность интеpфейсом, но не хочy пpавить его А>>самого. Делаю так
А>>public class B: A, IInterface А>>{ А>>//pеализация методов интеpфейса А>>}
А>>Ожидаю что B бyдет десеpеализоваться так же как A, но не тyт-то было. А>>Полyчаю ошибкy в фоpмате XML файла. В чём косяк? L>1) Ты пытаешься десериализовать старый файл, созданный без интерфейса
Да, но интерфейс такой что не должен влиять на вид сереализованных данных. L>2) Ты испортил файл(попробуй открой в Експлорере, ругаться не должен
Нет. L>3) Ты пытаешься десериализовать файл, не определив сеттеры в интерфейсе и самом классе
Не понял о чём речь, по поводу классов посмотри соседнюю ветку. L>4) Ты не определил открытого конструктора в классе A(он должен быть без параметров вроде бы...)
Действительно не определил, но всё работало и без этого. L>5) еще что-то... Пиши ексепшн
Материт первую же строку xml файла. Вернее вторую где уже структура а не само определение <?xml
Здравствуйте, stump, Вы писали:
S>Здравствуйте, Torinous, Вы писали:
S>Что ты в прятки играешь. Тебе проблему решить надо или просто пообщаться хочется? S>Покажи xml и exception.
Просто мне нужно снова переписывать код в неработающем виде чтобы показать.
Да и ничего это не даст, ошибка что-то вроде Wrong XML data и два числа указывающие на символ перевод строки после первой строчки XML файла.
V — сюда.
<?xml version="1.0" encoding="iso-8859-1"?>
<pnml>...
Всё это нужно для десереализации сереализация как таковая меня не интересует.
PS. А тебе что пообщаться влом.
PPS. Кстати почему сменилась тема?
Здравствуйте, stump, Вы писали:
S>>>Здравствуйте, Torinous, Вы писали:
S>>>Что ты в прятки играешь. Тебе проблему решить надо или просто пообщаться хочется? S>>>Покажи xml и exception.
T>>Просто мне нужно снова переписывать код в неработающем виде чтобы показать. T>>Да и ничего это не даст, ошибка что-то вроде Wrong XML data и два числа указывающие на символ перевод строки после первой строчки XML файла.
T>> V — сюда. T>><?xml version="1.0" encoding="iso-8859-1"?> T>><pnml>...
T>>Всё это нужно для десереализации сереализация как таковая меня не интересует.
T>> PS. А тебе что пообщаться влом. T>> PPS. Кстати почему сменилась тема? S>Общаться мне не влом, просто времени мало, да и стоит оно у меня достаточно дорого. Тем не менее считаю что людям надо помогать. А отстутствие достаточно информации мешает это сделать. S>По существу вопроса. S>Тебе надо копать в направлении аттрибутов XmlIncludeAttribute и XmlRootAttribute. S>XmlIncludeAttribute используется для указания наследников данного класса которые могут быть десериализованы. В твоих терминах этот атрибут надо повесить над классом А и указать в нем тип класса В. S>Можно попробовать тупо повесить атрибут XmlRootAttribute над классом В и прописать в нем имя xml элемента который надо десериализовать (поскольку надо полагать имя класса и имя xml у тебя не совпадают).
Воспользовавшись XmlRootAttribute мне удалось добиться того чего я и хотел, теперь в проекте станет меньше рутины, не придется редактировать автогенерируемые файлы и т.д.
Вот видите мое сопротивление не помешало вам помочь мне , за что большое спасибо.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Torinous, Вы писали:
T>>где ptnet.pnml это класс A, я расчитывал что при замене на B всё также заработает, но...
_FR>Сравни текст Xml из потока — наверняка в нём упоминается имя класса B
Вам тоже спасибо, ваше письмо навело меня на мысль о моей ошибке.