我正在尝试根据以下XML代码在C#中创建一个类:
<?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 to c# Question,但我无法解决问题。我的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; } }
}
我收到以下错误消息:
CADtoXML.exe中发生未处理的“System.StackOverflowException”类型异常
我试过使用XML序列化器没有运气;我认为它与XML代码中存在sub子元素的事实有关。书 - &gt;标题 - &gt; TitleA。任何帮助将不胜感激。
我之前尝试过这个解决方案,但后来我得到了这个错误:对象引用未设置为对象的实例。我在主类中运行的代码如下
Catalog book1 = new Catalog();
book1.Book.Author = "A";
book1.Book.Publisher = "A";
book1.Book.Pub_Date = "A";
然后我将它们导入列表并使用Serializer创建一个新的XML文件。
不知道这是否有帮助。
像这样:
BookClass book1 = new BookClass();
book1.Author = "A";
book1.Publisher = "A";
book1.Pub_Date = "A";
book1.Title.TitleA = "A";
我仍有同样的问题。我无法制作书籍。标题。标题,然后我必须这样做:
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代码,带有子子元素,就像我在第一篇文章中提到的那样。
感谢您的帮助到目前为止;)
答案 0 :(得分:7)
你得到一个StackOverflowException
,因为你的财产正在访问自己,这导致某种无休止的递归:
Book属性调用Book属性调用Book属性调用Book属性...
您应该使用支持字段,或使用自动属性:
public class Catalog
{
public BookClass Book
{
get;
set;
}
}