Десериализация XML-файла в .Net Object

1

Я пытаюсь десериализовать xml файл для объекта .NET, делая что-то вроде:

CarCollection myCarCollection = null;
string path = "CarCollection.xml";

XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));

StreamReader reader = new StreamReader(path);
myCarCollection= (CarCollection)serializer.Deserialize(reader);
reader.Close();

Вот файл xml, который я использую:

<?xml version="1.0" encoding="utf-8" ?>
<CarCollection>
  <Car ID="A">
    <CarType Make="Ford" Model="Focus" />
    <CarOwner Name="Tom">
      <Report Type="Service">
        <ReportList>
          <Date>20-08-2010</Date>
        </ReportList>
      </Report>
    </CarOwner>
  </Car>
  <Car ID="B">
    <CarType Make="Vauxhall " Model="Corsa" />
    <CarOwner Name="Joe">
      <Report Type="Service">
        <ReportList>
          <Date>10-10-2008</Date>
          <Date>10-10-2009</Date>
          <Date>10-10-2010</Date>          
        </ReportList>
     </Report>
      <Report Type="Accident">
        <ReportList>
         <Date>20-01-2011</Date>
        </ReportList>
      </Report>
    </CarOwner>
  </Car>
</CarCollection>

Я пробовал много вещей, но не могу заставить его работать.

Может кто-нибудь, пожалуйста, помогите мне, как сделать deserialize для объекта .NET.

Вот объекты С#

[Serializable()]
[XmlRoot("CarCollection")]
public class CarCollection
{
    [XmlArray("Car")]
    [XmlArrayItem("Car", typeof(Car))]
    public Car[] Cars { get; set; }
}

[Serializable()]
public class Car
{
    [XmlAttribute("Make")]
    public string CarMakeType { get; set; }

    [XmlAttribute("Model")]
    public string CarModelType { get; set; }

    [XmlArray("CarOwner")]
    [XmlArrayItem("CarOwner", typeof(CarOwner))]
    public CarOwner[] CarOwners { get; set; }
}

[Serializable()]
public class CarOwner
{
    [XmlAttribute("Name")]
    public string Name { get; set; }

    [XmlArray("Report")]
    [XmlArrayItem("Report", typeof(Report))]
    public Report[] Reports { get; set; }
}

[Serializable()]
public class Report
{
    [XmlAttribute("Type")]
    public string Type { get; set; }

    [XmlArray("Report")]
    [XmlArrayItem("Report", typeof(DateTime))]
    public DateTime[] Reports { get; set; }
}
Теги:
serialization

3 ответа

2
Лучший ответ

Потенциально вы можете найти преимущество в использовании XSD для генерации XML из ваших классов.

  • 0
    Я пробовал это однако. я получаю следующую ошибку: Невозможно создать временный класс (результат = 1). ошибка CS0030: невозможно преобразовать тип 'CarCollectionCarCarOwnerReportReportListDate []' в 'CarCollectionCarCarOwnerReportReportListDate' ошибка CS0029: невозможно неявное преобразование типа 'CarCollectionCarCarOwnerReportReportListDate' в 'CarCollectionDarport]
  • 0
    Я обнаружил проблему с использованием XSD. Я не решил проблему с помощью инструмента. Спасибо
Показать ещё 1 комментарий
2

Я уверен, что это связано с форматом даты. Объявление xmlns также отсутствует.

Предложение Felice является хорошим. Попробуйте создать желаемый результат с сериализацией, прежде чем пытаться десериализовать

  • 0
    Я не уверен, как сериализовать объект. Пока я просто получаю нулевой объект. Код будет скомпилирован и запущен, но я получаю объект null cars.
0

Прочитайте эту страницу в MSDN, чтобы проверить свой код. Желтая заметка на половине страницы указывает, какие требования должны выполняться коллекциями.

Также: также передать тип Car, в конструктор Serializer.

ИЗМЕНИТЬ Теги Report и Car не закрыты!

ИЗМЕНИТЬ

Вот результат при сериализации. Определить различия есть много. Самая большая проблема заключается в том, как вы сериализуете массивы. Начните использовать множественные числа (Cars, Owners) для коллекций, которые сделают его более удобочитаемым.

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

<Car>
    <Car Make="make">
        <CarOwner>
            <CarOwner Name="name1">
                <Report>
                    <Report Type="rtype">
                        <Report>
                            <Report>2011-01-25T15:22:52.703125+01:00</Report>
                        </Report>
                    </Report>
                </Report>
            </CarOwner>
        </CarOwner>
    </Car>
    <Car Make="make2">
        <CarOwner>
            <CarOwner Name="name3">
                <Report>
                    <Report Type="rtype">
                        <Report>
                            <Report>2011-01-25T15:22:52.703125+01:00</Report>
                        </Report>
                    </Report>
                </Report>
            </CarOwner>
        </CarOwner>
    </Car>
</Car>

  • 0
    в отношении незакрытых тегов: возможно, это произошло из-за того, что ОП неправильно отформатировал уценку; Я пытался это исправить.
  • 0
    Была проблема с размещением кода, я постараюсь это исправить

Ещё вопросы

Сообщество Overcoder
Наверх
Меню