Почему из двух одинаковых типов xmls, один не десериализуется, а другой? - PullRequest
0 голосов
/ 06 января 2012

Предположим, у меня есть два разных xml-файла в качестве встроенного ресурса в одной сборке:

Hummer.xml

<?xml version="1.0" encoding="utf-8" ?>
<car company="GMC" brand="Hummer" />

HammerHead.xml

<?xml version="1.0" encoding="utf-8" ?>
<shark species="HammerHead" length="45" />

Car.cs используя Систему; using System.Collections.Generic; используя System.Text; использование System.Xml.Serialization;

namespace XmlDeserialization_Test
{
    [XmlRoot("car"), XmlType("car")]    
    public class Car
    {
        [XmlAttribute("company")]
        public string Company { get; set; }
        [XmlAttribute("brand")]
        public string Brand { get; set; }
    }
}

Shark.cs используя Систему; using System.Collections.Generic; используя System.Text; использование System.Xml.Serialization;

namespace XmlDeserialization_Test
{
    [XmlRoot("shark"), XmlType("shark")]
    public class Shark
    {
        [XmlAttribute("species")]
        public string Species { get; set; }
        [XmlAttribute("length")]
        public double Length { get; set; }
    }
}

Program.cs

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

namespace XmlDeserialization_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Car> carList = new List<Car>();
            List<Shark> sharkList = new List<Shark>();

            Assembly assembly = Assembly.LoadFrom("XmlDeserialization_Test.exe");
            string[] manifestResourceNames = assembly.GetManifestResourceNames();

            Array.Sort<string>(manifestResourceNames);

            foreach (string mrn in manifestResourceNames)
            {
                Stream stream = assembly.GetManifestResourceStream(mrn);
                XmlSerializer serializer = new XmlSerializer(typeof(Shark));
                object obj = serializer.Deserialize(stream);

                if (obj is Car)
                {
                    carList.Add((Car)obj);
                }
                else if (obj is Shark)
                {
                    sharkList.Add((Shark)obj);
                }
            }            
        }
    }
}

HammerHead - Акула отлично десериализуется.

Но, Хаммер - машины нет. Создается следующее исключение:

There is an error in XML document (2, 2).
"<car xmlns=''> was not expected."

Если Акула десериализуется, почему Автомобиль не? Если Автомобиль генерирует исключение, почему Акула нет?

Я не в курсе !!!

1 Ответ

3 голосов
/ 06 января 2012

Вы пытаетесь десериализовать "автомобильный" объект с помощью "акулы", десериализуйте его. Если вы перейдете к созданию десериализатора типа Car, вы получите противоположный результат:

сериализатор XmlSerializer = новый XmlSerializer (typeof ( Car ));

Я не знаю, как вы сериализуете, но это должно дать вам представление.

...