StackOverflowException в классе XML для C # - PullRequest
5 голосов
/ 02 марта 2011

Я пытаюсь создать класс в C # на основе следующего XML-кода:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Catalog>
<Book>
    <Title><TitleA>ORK</TitleA></Title>
    <Author>J.D. Salinger</Author>
    <Publisher>Little Brown and Company</Publisher>
    <Pub_Date>1951</Pub_Date>
</Book>
<Book>
    <Title><TitleA>NAA</TitleA></Title>
    <Author>Jan</Author>
    <Publisher>Jans forlag</Publisher>
    <Pub_Date>2011</Pub_Date>
</Book> 
</Catalog>

Я смотрел в этой теме XML на c # Вопрос , но мне не удалось решить проблему. Мой код C # выглядит так:

public class Catalog
{
    public BookClass Book { get { return Book; } set { Book = value; } }
}

public class BookClass
{
    public TitleClass Title { get { return Title; } set { Title = value; } }
    public string Author { get { return Author; } set { Author = value; } }
    public string Publisher { get { return Publisher; } set { Publisher = value; } }
    public string Pub_Date { get { return Pub_Date; } set { Pub_Date = value; } }

}
public class TitleClass
{

    public string TitleA { get { return TitleA; } set { TitleA = value; } }
}

Я получаю следующее сообщение об ошибке:

Произошло необработанное исключение типа «System.StackOverflowException» в CADtoXML.exe

Я безуспешно пытался использовать сериализатор XML; Я думаю, что это как-то связано с тем, что в под-элементе есть XML-код. Книга -> Название -> Название А. Любая помощь будет принята с благодарностью.

Обновление 1:

Я пробовал это решение раньше, но затем я получаю эту ошибку: ссылка на объект не установлена ​​для экземпляра объекта. Код, который я запускаю в основном классе, выглядит следующим образом:

Catalog book1 = new Catalog();
book1.Book.Author = "A";
book1.Book.Publisher = "A";
book1.Book.Pub_Date = "A";

И после этого я импортирую их в список и использую Сериализатор для создания нового XML-файла.

Не знаю, может ли это помочь.

Обновление 2:

Вот так:

BookClass book1 = new BookClass();
book1.Author = "A";
book1.Publisher = "A";
book1.Pub_Date = "A";
book1.Title.TitleA = "A";

У меня все та же проблема. Я не могу сделать book1.Title.TitleA, тогда я должен сделать это:

TitleClass book2 = new TitleClass();
book2.TitleA = "A";

Но теперь это два разных объекта, book1 и book2 .... И они основаны на двух разных классах, и поэтому я не могу использовать это (перечислить объект и затем сделать его XML-кодом:

List<BookClass, TitleClass> books = new List<BookClass, TitleClass>() { book1, book2 };
XmlSerializer x = new XmlSerializer(typeof(List<BookClass, TitleClass>), new XmlRootAttribute("TEST"));
x.Serialize(Console.Out, books);   

Я хочу это сделать, поэтому я получаю свой XML-код с элементом sub sub, как показано в моем первом посте.

Спасибо за помощь;)

1 Ответ

7 голосов
/ 02 марта 2011

Вы получаете StackOverflowException, потому что ваше свойство обращается к себе, что приводит к некоторой бесконечной рекурсии:
Свойство Book вызывает свойство Book, вызывает свойство Book, вызывает свойство Book ...

Вы должны использовать вспомогательное поле или использовать вместо него автоматические свойства:

public class Catalog
{
    public BookClass Book
    { 
      get; 
      set; 
    }
}
...