Приветствую. Такая проблема: есть класс, представляющий узел дерева, хранящий в себе массив со своими потомками.
[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 присутствует ошибка. Место выделено болдом. Это всегда тег закрытия описания первого крайнего листа. В чём может быть причина?
Здравствуйте, Zomb, Вы писали:
Z>Всё вроди замечательно, но при десериализации, сериалайзер мне говорит, что в документе XML присутствует ошибка. Место выделено болдом. Это всегда тег закрытия описания первого крайнего листа. В чём может быть причина?
Он хочет хотя бы один элемент в массив.
Если руки золотые, не важно из какого места они растут.
Здравствуйте, 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);
Если руки золотые, не важно из какого места они растут.
Здравствуйте, 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: В экземпляре объекта не задана ссылка на объект.
Или это результат того, что ему нечего в сериалайзер класть?