Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Проблемы с сериализацией


Автор: Чердак 10.4.2009, 10:07
Необходимо сохранить свойства объекта в xml файл. Вот класс моего объекта:
Код

 [Serializable]
    public class PlanData
    {

        public PlanData()
        {
           
            Documents = new ObservableCollection<Document>();
            Tools = new ObservableCollection<Tool>();
           
        }

        public string PrichinaMej
        {
            get;
            set;
        }

        public string Object
        {
            get;
            set;
        }
      
        public ObservableCollection<Document> Documents
        {
            get;
            set;
        }

       
        public ObservableCollection<Tool> Tools
        {
            get;
            set;
        }
       }
    [Serializable]
    public class Tool
    {
        public Tool()
        {
        }
        public string Name
        {
            get;
            set;
        }
        public string Certificate
        {
            get;
            set;
        }
        public string Svidetelstvo
        {
            get;
            set;
        }
    }

 [Serializable]
    public class Document
    {
         public Document()
         {
         }
        public string Name
        {
            get;
            set;
        }
        public string Recviziti
        {
            get;
            set;
        }
    }


В коде сериализую:
Код

  public void SerializableData()
        {
                FileStream fs = new FileStream("FileSave.xml", FileMode.Create);
                System.Xml.Serialization.XmlSerializer x1 = new System.Xml.Serialization.XmlSerializer(typeof(PlanData));
                x1.Serialize(fs, CurDoc);
                fs.Close();
                MessageBox.Show("Объект успешно сериализован в файл c:\\Primer.xml");
            
        }


На строке: 
Код

System.Xml.Serialization.XmlSerializer x1 = new System.Xml.Serialization.XmlSerializer(typeof(PlanData));
 
Выдает ошибку  "Возникла ошибка при отражении типа "
В чем тут дело? Не могу разобраться.

Автор: altarvic 10.4.2009, 10:42
[XmlSerializable]

сорри, попутал малость smile

Автор: Чердак 10.4.2009, 10:57
Error    1    Не удалось найти имя типа или пространства имен 'XmlSerializable' (возможно, пропущена используемая директива или ссылка на сборку)    
что-то не могу найти, какой неймспайс нужен

Добавлено @ 10:59
using System.Xml.Serialization; - добавил, не помогло

Добавлено @ 11:07
Пишу так, ошибка: 
Код

public class AccuracyChPoint : IXmlSerializable


Error    1    'VSoft.GEO.Mejevanie.AccuracyChPoint' не реализует член интерфейса 'System.Xml.Serialization.IXmlSerializable.GetSchema()'    

Автор: Idsa 10.4.2009, 11:54
altarvic, что за атрибут такой?

Чердак, Xml-сериализация вообще не требует атрибута. Посмотрите, какой InnerException в первом примере.

Добавлено через 2 минуты
А CurDoc - переменная типа PlanData? Судя по ее имени, можно предположить, что это экземпляр типа Document. Если так, то в конструктор XmlSerializer нужно передавать typeof(Document).

Автор: Чердак 10.4.2009, 12:04
Цитата

А CurDoc - переменная типа PlanData?

Да, тип PlanData.

InnerException^

{"Возникла ошибка при отражении свойства \"TableOfContents\"."}
{System.Collections.ListDictionaryInternal}
null

Да, я не полностью класс сюда добавил, есть еще одно свойство:
Код

[Serializable]
    public class PlanData
    {

///----------------------
        public TableOfContents TableOfContents
        {
            get;
            set;
        }
///-------------------------

    }

 [Serializable]
    public class TableOfContents 

    {
        public TableOfContents()
        {
        }
        public Dictionary<string, bool> TableOfCont
        {
            get;
            set;
        }

        public string Type
        {
            get;
            set;
        }
       
    }

Автор: Idsa 10.4.2009, 12:14
Чердак, сделайте тестовое приложение и прикрепите к посту.

Автор: Idsa 10.4.2009, 12:30
Дело таки в Dictionary: http://www.google.ru/search?q=.net+serialize+dictionary&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a

Автор: Чердак 10.4.2009, 12:32
Создал

Автор: Чердак 10.4.2009, 13:21
У меня же не класс типа Dictionary, а свойство. 

Автор: Idsa 10.4.2009, 13:33
Цитата(Чердак @  10.4.2009,  17:21 Найти цитируемый пост)
У меня же не класс типа Dictionary, а свойство.  

Сериализуются не классы, а их экзмепляры. У Вас свойство типа Dictionary, в котором хранится ссылка на экземпляр.

Автор: Чердак 10.4.2009, 14:03
Погуглил... так и не понял, что делать  smile 

Автор: Partizan 10.4.2009, 14:22
Чердак, вариантов - тьма smile

1. Сделать свою сериализуемую структуру данных аналогичную Dictionary
2. Юзать List<KeyValuePair<string, bool>>
3. Сделать структурку с полями типа string и bool и хранить List таких структурок

Добавлено через 2 минуты и 17 секунд
Чердак, 
4. поюзать то, что выдаёт гугль по ссылке от Idsa
5. засериализовать бинарной сериализацией и пихнуть это текстом в xml =)

Автор: Чердак 10.4.2009, 14:43
Создал класс
Код

 public class DictionaryCollection<TValue> : DictionaryBase, IXmlSerializable
    {
        private XmlSerializer valueSerializer;
        private XmlSerializer keySerializer;

        public DictionaryCollection()
        {
            keySerializer = new XmlSerializer(typeof(String));
            valueSerializer = new XmlSerializer(typeof(TValue));
        }
        public TValue this[string key]
        {
            get { return (TValue)this.Dictionary[key]; }
            set { this.Dictionary[key] = value; }
        }

        public void Add(String key, TValue value)
        {
            this.Dictionary.Add(key, value);
        }
        public void WriteXml(System.Xml.XmlWriter writer)
        {
            foreach (String key in this.Dictionary.Keys)
            {
                keySerializer.Serialize(writer, key);
                valueSerializer.Serialize(writer, this[key]);
            }
        }

        public void ReadXml(System.Xml.XmlReader reader)
        {
            reader.Read();
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                String key = (String)keySerializer.Deserialize(reader);
                TValue value = (TValue)valueSerializer.Deserialize(reader);

                reader.MoveToContent();
                Add(key, value);
            }
        }
    }


а как его юзать хз

и ошибка класса:
Error    1    'VSoft.GEO.Mejevanie.DictionaryCollection<Boolean>' не реализует член интерфейса 'System.Xml.Serialization.IXmlSerializable.GetSchema()'    

Автор: Partizan 10.4.2009, 15:23
Чердак, надо слепо следовать указаниям компилятора и таки реализовать метод GetSchema =)

Автор: Чердак 11.4.2009, 15:15
Вообще отказался от Dictionary.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)