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


Автор: dAlex 15.6.2011, 09:56
Нужно сериализовать несколько коллекций

Код

[Serializable]
    public class ChartItem : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }     
        
        private double _Item;
        private DateTime _Time;

        public double Item
        {
            get { return _Item; }
            set
            {
                _Item = value;
                OnPropertyChanged("Item");
            }
        }
        public DateTime Time
        {
            get { return _Time; }
            set
            {
                _Time = value;
                OnPropertyChanged("Time");
            }
        }
        public ChartItem()
        {                 
            Time = MainWindow.Instance.Trader.Trader.MarketTime;
        }     
        public ChartItem(double _item, DateTime _time)
        {
            Item = _item;
            Time = _time;
        }
    }

Код

XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<ChartItem>));
using (StreamWriter stream = new StreamWriter("D:\\appgdata.xml"))
{
        serializer.Serialize(stream, rgo);
        serializer.Serialize(stream, rdgo);
        serializer.Serialize(stream, rs);
        serializer.Serialize(stream, rp);
        serializer.Serialize(stream, cc);
}   

Получается вот такой файл
Код

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfChartItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <ChartItem>
    <Item>53190</Item>
    <Time>2011-06-15T10:20:13.40625+04:00</Time>
  </ChartItem>
  <ChartItem>
    <Item>106380</Item>
    <Time>2011-06-15T10:20:39.4375+04:00</Time>
  </ChartItem>
  ...
</ArrayOfChartItem><?xml version="1.0" encoding="utf-8"?>
<ArrayOfChartItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <ChartItem>
    <Item>342</Item>
    <Time>2011-06-15T10:20:39.4375+04:00</Time>
  </ChartItem>
  <ChartItem>
    <Item>1083</Item>
    <Time>2011-06-15T10:20:40.4375+04:00</Time>
  </ChartItem>
  ...
</ArrayOfChartItem><?xml version="1.0" encoding="utf-8"?>
<ArrayOfChartItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
  <ChartItem>
    <Item>57</Item>
    <Time>2011-06-15T10:20:40.4375+04:00</Time>
  </ChartItem>
  <ChartItem>
    <Item>114</Item>
    <Time>2011-06-15T10:20:44.421875+04:00</Time>
  </ChartItem>
  ...
</ArrayOfChartItem><?xml version="1.0" encoding="utf-8"?>
<ArrayOfChartItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ChartItem>
    <Item>0</Item>
    <Time>2011-06-15T10:19:57.53125+04:00</Time>
  </ChartItem>
  <ChartItem>
    <Item>342</Item>
    <Time>2011-06-15T10:20:13.40625+04:00</Time>
  </ChartItem>
  ...
</ArrayOfChartItem><?xml version="1.0" encoding="utf-8"?>
<ArrayOfChartItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ChartItem>
    <Item>94.65</Item>
    <Time>2011-06-15T10:19:56.015625+04:00</Time>
  </ChartItem>
  <ChartItem>
    <Item>94.67</Item>
    <Time>2011-06-15T10:19:56.53125+04:00</Time>
  </ChartItem>
   ....
</ArrayOfChartItem>

При десериализации
Код

XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<ChartItem>));
using (StreamReader stream = new StreamReader("D:\\appgdata.xml"))
{                
    rgo = (ObservableCollection<ChartItem>)serializer.Deserialize(stream);
    rdgo = (ObservableCollection<ChartItem>)serializer.Deserialize(stream);
    rs = (ObservableCollection<ChartItem>)serializer.Deserialize(stream);
    rp = (ObservableCollection<ChartItem>)serializer.Deserialize(stream);
    cc = (ObservableCollection<ChartItem>)serializer.Deserialize(stream); 
}


в первой же строчке rgo = (ObservableCollection<ChartItem>)serializer.Deserialize(stream) вылетает ексепшн - что-то там ему не нравится в xml-документе. 
конкретнее:
Цитата

Message=Unexpected XML declaration. The XML declaration must be the first node in the document, and no white space characters are allowed to appear before it. Line 11, position 22.

там находится знак вопроса, <?xml version="1.0" encoding="utf-8"?>
Можно ли вообще несколько однотипных коллекций сериализовать в один файл или там какие-то нюансы?

Автор: dAlex 15.6.2011, 11:41
ага, нашла, что должен быть только один root-элемент в xml, и тогда строчка
Код

<?xml version="1.0"?>

будет только одна. И что тогда делать, пихать их вместе в какой-то класс, только для сериализации?

upd: убрала в другой сериализуемый класс, все работает.

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