Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   XML сериализация массива объектов (http://forum.oszone.net/showthread.php?t=237697)

Tonny_Bennet 02-07-2012 13:00 1944274

XML сериализация массива объектов
 
Здравствуйте.

Тут я задавал вопрос о конструкторе класса. Сейчас проблема немного другая.

Есть несколько классов (LineIO, Rel, Adc), которые отдельно друг от друга нормально сериализуются в вид XML. Есть класс который называется Module, полями которого являются вышеописанные классы. У него есть конструктор без аргументов.

Код:

    public Module()
        {
            _lineIO = new LineIO[19];
            for (int i = 0; i <= _lineIO.Length - 1; i++)
            {
                lineIO[i] = new LineIO();
            }

            _rel = new Rel[5];
            for (int i = 0; i <= _rel.Length - 1; i++)
            {
                _rel[i] = new Rel();
            }

            _adc = new Adc[5];
            for (int i = 0; i <= _adc.Length - 1; i++)
            {
                _adc[i] = new Adc();
            }
        }

При попытке сериализации класса Module появляется ошибка



Понять из-за чего всё это происходит я не смог.

Для теста сделал похожий класс состоящий из массива целых чисел.

Код:

public class test
    {
        private int[] ttt;

        public int[] T
        {
            get { return ttt; }
            set { ttt = value; }
        }

        public test()
        {
            ttt = new int[5];

            for (int i = 0; i < ttt.Length; i++)
            {
                ttt[i] = 0;
            }
        }

    }

Он нормально сериализуется.

Код:

<?xml version="1.0" encoding="utf-8"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <T>
    <int>0</int>
    <int>0</int>
    <int>0</int>
    <int>0</int>
    <int>0</int>
  </T>
</test>

Подскажите пожалуйста где я недоглядел.

ferget 03-07-2012 03:09 1944686

не удается воспроизвести ошибку

можете сделать минимальный проект с ошибкой?

Tonny_Bennet 03-07-2012 09:32 1944738

ferget, Удалось создать минимальный проект с ошибкой. В классе Module должны быть поля двух классов (в примере LineIO, Rel)

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace test_module
{
    class Program
    {
        static void Main(string[] args)
        {

            Module Mod = new Module();

            XmlSerializer ModSer = new XmlSerializer(Mod.GetType());

            using (StreamWriter ModSw = File.CreateText("Mod.txt"))
            {
                ModSer.Serialize(ModSw, Mod);
            }
        }
    }

    public class LineIO
    {
        public enum direct
        {
            Out = 0,
            In = 1,
        };

        private direct _dir;

        public enum state
        {
            _0,
            _1,
        }

        private state _state;

        public direct Direct
        {
            get { return _dir; }
            set { _dir = value; }
        }

        public state State
        {
            get { return _state; }
            set { _state = value; }
        }

        public LineIO()
        {
            _state = state._0;
            _dir = direct.Out;
        }
    }

    public class Rel
    {
        public enum state
        {
            _0,
            _1,
        }

        private state _state;

        public state State
        {
            get { return _state; }
            set { _state = value; }
        }

        public Rel()
        {
            _state = state._0;
        }
    }

    public class Module
    {
        private LineIO[] _lineIO;

        public LineIO[] lineIO
        {
            get { return _lineIO; }
            set { _lineIO = value; }
        }

        private Rel[] _rel;

        public Rel[] rel
        {
            get { return _rel; }
            set { _rel = value; }
        }

        public Module()
        {
            _lineIO = new LineIO[19];
            for (int i = 0; i < _lineIO.Length; i++)
            {
                lineIO[i] = new LineIO();
            }

            _rel = new Rel[5];
            for (int i = 0; i < _rel.Length; i++)
            {
                _rel[i] = new Rel();
            }
        }
    }
}

Если оставить только один класс (К примеру Rel) объект сериализуется.

PHP код:

<?xml version="1.0" encoding="utf-8"?>
<Module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <rel>
    <Rel>
      <State>_0</State>
    </Rel>
    <Rel>
      <State>_0</State>
    </Rel>
    <Rel>
      <State>_0</State>
    </Rel>
    <Rel>
      <State>_0</State>
    </Rel>
    <Rel>
      <State>_0</State>
    </Rel>
  </rel>
</Module>


ferget 04-07-2012 02:19 1945409

читаем ошибку

Цитата:

System.InvalidOperationException: Возникла ошибка при отражении типа "sx1.Module". ---> System.InvalidOperationException: Возникла ошибка при отражении свойства "rel". ---> System.InvalidOperationException: Возникла ошибка при отражении типа "sx1.Rel". ---> System.InvalidOperationException: Возникла ошибка при отражении свойства "State". ---> System.InvalidOperationException: Возникла ошибка при отражении типа "sx1.Rel.state". ---> System.InvalidOperationException: Типы "sx1.Rel.state" и "sx1.LineIO.state" используют имя типа XML "state" из пространства имен "". Используйте атрибуты XML, чтобы задать для типа уникальное имя и/или пространство имен XML.
заменяем все state на ttt

и все работает

Tonny_Bennet 04-07-2012 11:53 1945586

ferget, спасибо поправил - заработало. Проблема как вы и сказали заключалась в уникальности полей XML документа.


Время: 20:55.

Время: 20:55.
© OSzone.net 2001-