Получение InvalidOperationException при десериализации в C # - PullRequest
0 голосов
/ 10 марта 2012

Я использую XML-файл .config для хранения некоторых записей.мой XML ниже:

    <?xml version="1.0" encoding="utf-8"?>
    <Data_List xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Configuration>
        <Name>1st Week</Name>
        <Binary>
          <Field>field1</Field>
          <Version>1.0</Version>
        </Binary>
        <Binary>
          <Field>field2</Field>
          <Version>2.0</Version>
        </Binary>
    </Configuration>
      <Configuration>
        <Name>2nd Week</Name>
        <Binary>
          <Field>field1</Field>
          <Version>2.0</Version>
        </Binary>
        <Binary>
          <Field>field2</Field>
          <Version>4.0</Version>
        </Binary>
    </Configuration>
</Data_List>

Я использую код C # следующим образом:

public Binary
{
public String Field;
public String Version;
}

public Configuration
{
public String Name;
public List<Binary> Binary_List = new List<Binary>();

public GetfromXML()
{
List<Configuration> lists = new List<Configuration>();
TextReader reader = new StreamReader("Data_List.config");
XmlSerializer serializer = new XmlSerializer(typeof(List<Configuration>));
lists=(List<Configuration>)serializer.Deserialize(reader);
reader.Close();
}

Я получаю исключениеговоря: «В XML-документе (2,2) есть ошибка». Может кто-нибудь помочь, пожалуйста?

1 Ответ

3 голосов
/ 10 марта 2012

Я думаю, проблема в том, что ваша модель не очень хорошо структурирована.Другими словами, сериализатор не знает, как читать ваш .xml.

Ваш xml неверен.Когда у вас есть список , в .XML будет:

    <ArrayOfT></ArrayOfT>

.Вот как вам нужно это сделать!

  1. Сначала попробуйте использовать атрибуты xml из System.Xml.Serialization (то есть [XmlArray ()])

  2. Было бы лучше, если бы вы использовали FileStream вместо простого указания URI

     using(var filestream = new FileStream(//your uri, FIleMode.Open)
    {
    }
    
  3. Используйте свойства вместо переменных.Потому что позже вы можете захотеть связать.

Пример моего кода, как мне удалось решить эту проблему:

public ServiceMap Deserialize()
    {
        ServiceMap serviceMap = new ServiceMap();

        try
        {
            using (var fileStream = new FileStream(Settings.ServiceMapPath, FileMode.Open))
            {
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.IgnoreComments = true;

                using (XmlReader reader = XmlReader.Create(fileStream, settings))
                {
                    serviceMap = _serializer.Deserialize(reader) as ServiceMap;
                }
            }
        }
        catch (FileNotFoundException)
        {
            MessageBox.Show("File 'ServiceMap.xml' could not be found!");
        }

        return serviceMap;
    }

Мой класс ServiceMap:

    [XmlRoot("ServiceMap")]
public class ServiceMap
{
    [XmlArray("Nodes")]
    [XmlArrayItem("Node")]
    public List<Node> Nodes = new List<Node>();

    [XmlArray("Groups")]
    [XmlArrayItem("Group")]
    public List<Group> Groups = new List<Group>();

    [XmlArray("Categories")]
    [XmlArrayItem("Category")]
    public List<Category> Categories = new List<Category>();
}

РЕДАКТИРОВАТЬ: Мой XML:

<?xml version="1.0" encoding="utf-8"?>
<ServiceMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://   www.w3.org/2001/XMLSchema">
  <Nodes>
    <Node Name="Predrag">
  <Children>
    <Child>dijete1</Child>
    <Child>dijete2</Child>
    <Child>dijete3</Child>
    <Child>dijete4</Child>
  </Children>
  <Parents>
    <Parent>roditelj1</Parent>
    <Parent>roditelj2</Parent>
    <Parent>roditelj3</Parent>
  </Parents>
  <Group Name="Grupa" />
  <Category Name="Kategorija" />
</Node>
<Node Name="Tami">
  <Children>
    <Child>dijete1</Child>
    <Child>dijete2</Child>
  </Children>
  <Parents>
    <Parent>roditelj1</Parent>
  </Parents>
  <Group Name="Grupa2" />
  <Category Name="Kategorija2" />
</Node>

...