Проблема с десериализацией
От: Zomb  
Дата: 19.02.10 19:24
Оценка:
Приветствую. Такая проблема: есть класс, представляющий узел дерева, хранящий в себе массив со своими потомками.
    [Serializable]
    public class DlgString
    {
        int ID;
        [XmlAttribute]
        public int id {
            get { return ID; }
            set { ID = value; }
        }

        String TEXT;
        public String text {
            get { return TEXT; } 
            set { 
                TEXT = value;
                node.Text = value;
            } 
        }

        short TYPE;
        [XmlAttribute]
        public short type { 
            get { return TYPE; } 
            set { TYPE = value; } 
        }

        public ArrayList child;

        [XmlIgnore]
        public TreeNode node;

        public DlgString()
        {
            child = new ArrayList();   
        }

//прочие методы
    }

Мне всё это дерево надо сохранить, а потом загрузить обратно. Я его сериализую и выходит такой XML, к примеру.
<?xml version="1.0" encoding="utf-8"?>
<DlgString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="0" type="0">
  <child>
    <anyType xsi:type="DlgString" id="0" type="0">
      <child />
      <text>-----</text>
    </anyType>
    <anyType xsi:type="DlgString" id="0" type="0">
      <child />
      <text>-----</text>
    </anyType>
  </child>
  <text>-----</text>
</DlgString>

Всё вроди замечательно, но при десериализации, сериалайзер мне говорит, что в документе XML присутствует ошибка. Место выделено болдом. Это всегда тег закрытия описания первого крайнего листа. В чём может быть причина?
Re: Проблема с десериализацией
От: servancho Россия https://dedis.ru
Дата: 19.02.10 19:29
Оценка:
Здравствуйте, Zomb, Вы писали:

Z>Всё вроди замечательно, но при десериализации, сериалайзер мне говорит, что в документе XML присутствует ошибка. Место выделено болдом. Это всегда тег закрытия описания первого крайнего листа. В чём может быть причина?


Он хочет хотя бы один элемент в массив.
Если руки золотые, не важно из какого места они растут.
Re[2]: Проблема с десериализацией
От: Zomb  
Дата: 19.02.10 19:57
Оценка:
Здравствуйте, servancho, Вы писали:

S>Он хочет хотя бы один элемент в массив.


Засунул первым элементом int. Не помогло

<?xml version="1.0" encoding="utf-8"?>
<DlgString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="0" type="0">
  <child>
    <anyType xsi:type="xsd:int">1</anyType>
    <anyType xsi:type="DlgString" id="0" type="0">
      <child>
        <anyType xsi:type="xsd:int">1</anyType>
      </child>
      <text>-----</text>
    </anyType>
  </child>
  <text>-----</text>
</DlgString>
Re[3]: Проблема с десериализацией
От: servancho Россия https://dedis.ru
Дата: 20.02.10 07:49
Оценка:
Здравствуйте, Zomb, Вы писали:

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

S>>Он хочет хотя бы один элемент в массив.
Z>Засунул первым элементом int. Не помогло

Хорошо, а как ты сериализуешь? Только serialize на сериализаторе или что?
Т.к. ArrayList не типизирован ты должен сериализатору сказать какой там тип, либо пользовать генерик.

Примерно так должно быть.
Type[] extraTypes = new Type[] {typeof(YOUR_TYPE_NAME_1), typeof(YOUR_TYPE_NAME_2)};

System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList), extraTypes);
Если руки золотые, не важно из какого места они растут.
Re[4]: Проблема с десериализацией
От: Zomb  
Дата: 20.02.10 13:14
Оценка:
Здравствуйте, servancho, Вы писали:

S>Хорошо, а как ты сериализуешь? Только serialize на сериализаторе или что?

S>Т.к. ArrayList не типизирован ты должен сериализатору сказать какой там тип, либо пользовать генерик.

S>Примерно так должно быть.

S>
S>Type[] extraTypes = new Type[] {typeof(YOUR_TYPE_NAME_1), typeof(YOUR_TYPE_NAME_2)};

S>System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList), extraTypes); 
S>


Вроди так и делаю. Говорю ему, что это мой тип.
туды:
            XmlSerializer serializer = new XmlSerializer(typeof(DlgString));
            TextWriter sw = new StreamWriter(@"ListXM.xml");
            serializer.Serialize(sw, treeView1.SelectedNode.Tag);
            sw.Close();

обратно
                string FileName = openFileDialog.FileName;                
                FileStream fs = new FileStream(FileName, FileMode.Open);

                XmlSerializer serializer = new XmlSerializer(typeof(DlgString));
                DlgString o = ((DlgString)serializer.Deserialize(fs)); //тут говорит ошибка в XML


Ничего не понимаю. Сделал похожий класс, всё работает. Абсолютно одинаковая структура в XML, но один загружается, а другой нет...

    [Serializable]
    public class test
    {
        public ArrayList a;
        public test()
        {
            a = new ArrayList();
        }
    }


            test t = new test();
            t.a.Add(new test());
            t.a.Add(new test());
            XmlSerializer serializer = new XmlSerializer(typeof(test));
            TextWriter sw = new StreamWriter(@"ListXML.xml");
            serializer.Serialize(sw, t);
            sw.Close();
            FileStream fs = new FileStream(@"ListXML.xml", FileMode.Open);
            serializer = new XmlSerializer(typeof(test));
            test o = ((test)serializer.Deserialize(fs));
            fs.Close();


Запустил программку не из студии, а отдельно — в дополнительной информации об ошибке выдало ещё:
System.InvalidOperationException: В документе XML (7, 7) присутствует ошибка. ---> System.NullReferenceException: В экземпляре объекта не задана ссылка на объект.

Или это результат того, что ему нечего в сериалайзер класть?
Re: Проблема с десериализацией
От: Zomb  
Дата: 20.02.10 13:28
Оценка:
Я дурак, вопрос закрыт. Просто в дефолтном конструкторе не создавался node.
Re[2]: Проблема с десериализацией
От: servancho Россия https://dedis.ru
Дата: 20.02.10 16:29
Оценка:
Здравствуйте, Zomb, Вы писали:

Z>Я дурак, вопрос закрыт.


Видимо я тоже
Если руки золотые, не важно из какого места они растут.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.