locked
Сериализация производных классов в списке. RRS feed

  • Вопрос

  • Имеется вот так код:

     

    using (XmlWriter xmlWriter = XmlWriter.Create(stream))
              {
                xmlWriter.WriteStartElement("savedGameData");
                xmlWriter.WriteStartElement("levelState"); 
    
                //Здесь компилятор выдает исключение
                new XmlSerializer(typeof(List<Items>)).Serialize(xmlWriter, items);
                new XmlSerializer(typeof(List<Enemy>)).Serialize(xmlWriter, enemies);
                xmlWriter.WriteEndElement();
    
                xmlWriter.WriteEndElement();
              }
    


    Собственно оно: The type Money was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically

    Класс Money производный от Items.

    Как бы так решить эту проблему? По всей видимости XmlInclude нет в среде разработки для WP7

     

    28 июля 2011 г. 7:32

Ответы

  • По всей видимости XmlInclude нет в среде разработки для WP7
    Такой атрибут есть - XmlIncludeAttribute Class
    Отметьте им базовый класс с указанием производного
    [XmlInclude(typeof(ChildClass))]
    public class BaseClass
    {
    }
    public class ChildClass : BaseClass
    {
    }
    

    Для связи [mail]
    • Помечено в качестве ответа Arni Dexian 28 июля 2011 г. 12:31
    • Снята пометка об ответе Arni Dexian 28 июля 2011 г. 15:41
    • Помечено в качестве ответа Arni Dexian 29 июля 2011 г. 11:10
    28 июля 2011 г. 11:30
  • Скорость всегда важна. Вообщем я нашел проблему. В Enemy было свойство уровня в котором они находились. Достаточно было лишь убрать set. 

    Всем спасибо за внимание!

    • Помечено в качестве ответа Arni Dexian 31 июля 2011 г. 13:42
    30 июля 2011 г. 9:51

Все ответы

  • По всей видимости XmlInclude нет в среде разработки для WP7
    Такой атрибут есть - XmlIncludeAttribute Class
    Отметьте им базовый класс с указанием производного
    [XmlInclude(typeof(ChildClass))]
    public class BaseClass
    {
    }
    public class ChildClass : BaseClass
    {
    }
    

    Для связи [mail]
    • Помечено в качестве ответа Arni Dexian 28 июля 2011 г. 12:31
    • Снята пометка об ответе Arni Dexian 28 июля 2011 г. 15:41
    • Помечено в качестве ответа Arni Dexian 29 июля 2011 г. 11:10
    28 июля 2011 г. 11:30
  • Я вам сильно благодарен!
    28 июля 2011 г. 12:07
  • Если ответ является решением, отметьте его с помощью кнопки 'Пометить как ответ' под сообщением. Спасибо.


    Для связи [mail]
    28 июля 2011 г. 12:14
  • Еще вопрос, по той же теме:

    Следующий список:

    new XmlSerializer(typeof(List<Enemy>)).Serialize(xmlWriter, enemies);
    
    Как сериализовать его, если имеется следующая иерархия класса:
    http://s2.ipicture.ru/uploads/20110728/KadcYwW7.jpg
    То  есть базовый класс имеет производный п1, а п1 имеет еще

     производные, п21:п1, п22:п1







    28 июля 2011 г. 12:40
  • Картинку, к сожалению, не видно. А ошибка такая же возникает?


    Для связи [mail]
    29 июля 2011 г. 6:22
  • Ошибка A circular reference was detected while serializing an object of type 'List<...>

    Скорее всего это где-то у меня в коде возникает ошибка. 

    29 июля 2011 г. 7:31
  • Попробуйте отметить п1 также атрибутом XmlInclude:

    [XmlInclude(typeof(Child1)), XmlInclude(typeof(Child2))]
    


    Для связи [mail]
    29 июля 2011 г. 8:13
  • Это никак не влияет на результат, все дело в цикличной ссылке. Может все дело в ключевом слове Base?
    29 июля 2011 г. 10:24
  • Судя по всему, вы сохраняете состояние игры в XML. Как альтернатива, сохранять в IsolatedStorageSetting полноценные объекты со всеми их зависимостями.

    29 июля 2011 г. 19:38
  • Вопрос на засыпку: А вы бы сохраняли состояние, к примеру, полноценной трехмерной игры для ПК в реестре?
    29 июля 2011 г. 22:59
  • Это не реестр! Это изолированное хранилище, в которое вы будете складывать либо файлы, либо объекты (которые все равно сохраняются в файл) - других вариантов хранения данных на телефоне между сессиями у вас нет.

    30 июля 2011 г. 5:51
  • И реестр храниться в файле. И не в этом дело - каким способом не сохранять - все равно будет эта ошибка, которая находиться где-то в классе...
    30 июля 2011 г. 8:19
  • У вас ошибка - циклическая ссылка. BinaryFormatter прекрасно справляется с циклическими ссылками, но его в WP7 кажется нет. Есть подозрение, что IsolatedStorageSettings работают подобным образом, поэтому вполне можно попробовать использовать их. Я не проверял, поэтому точно сказать не могу, сработает циклическая ссылка или нет.

    Что же касается сравнения с реестром, то это не правильно. Если уж и сравнивать, то сравнивать с Settings в проектах для приложений под винду.


    Максимум в чем может быть проблема - это в скорости.
    30 июля 2011 г. 9:05
  • Скорость всегда важна. Вообщем я нашел проблему. В Enemy было свойство уровня в котором они находились. Достаточно было лишь убрать set. 

    Всем спасибо за внимание!

    • Помечено в качестве ответа Arni Dexian 31 июля 2011 г. 13:42
    30 июля 2011 г. 9:51