Войти

Показать полную графическую версию : XML сериализация массива объектов


Tonny_Bennet
02-07-2012, 13:00
Здравствуйте.

Тут (http://forum.oszone.net/thread-237488.html) я задавал вопрос о конструкторе класса. Сейчас проблема немного другая.

Есть несколько классов (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 появляется ошибка

http://s002.radikal.ru/i198/1207/62/54a53e6d23c4.png

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

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


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
не удается воспроизвести ошибку

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

Tonny_Bennet
03-07-2012, 09:32
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) объект сериализуется.


<?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
читаем ошибку

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




© OSzone.net 2001-2012