Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - XML сериализация массива объектов

Ответить
Настройки темы
.NET - XML сериализация массива объектов

Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 177


Конфигурация

Профиль | Отправить PM | Цитировать


Здравствуйте.

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

Есть несколько классов (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>
Подскажите пожалуйста где я недоглядел.

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 13:00, 02-07-2012

 

Аватара для ferget

Разный


Сообщения: 1294
Благодарности: 359

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 03:09, 03-07-2012 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 177

Профиль | Отправить PM | Цитировать


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>

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Последний раз редактировалось Tonny_Bennet, 03-07-2012 в 09:46.


Отправлено: 09:32, 03-07-2012 | #3


Аватара для ferget

Разный


Сообщения: 1294
Благодарности: 359

Профиль | Отправить PM | Цитировать


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

Цитата:
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

и все работает
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:19, 04-07-2012 | #4


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 177

Профиль | Отправить PM | Цитировать


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

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 11:53, 04-07-2012 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - XML сериализация массива объектов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBA - Проблема с использованием объектов в VB Medic84 Программирование и базы данных 0 19-12-2010 19:10
Лесенка на границах объектов Den47 Видео и аудио: обработка и кодирование 7 04-06-2009 21:01
VBS/WSH/JS - WSH + FSO - поиск объектов по каталогам dsa Программирование и базы данных 4 25-08-2008 20:18
JS:Описание объектов и их свойств Guest Вебмастеру 4 10-10-2004 14:17
Перечисление объектов типов vasketsov Программирование и базы данных 3 24-04-2002 17:32




 
Переход