思归 大哥请进,请教一个关于 从XML文件反序列化对象的问题?

linuxyf 2004-12-23 08:57:13
我有一个Book类:
public class Book
{
public Book() { }
public string Title;
public string Author;
public string ISBN;
public string Publisher;
}

static void Main(string[] args)
{
Book BookObject = new Book();
XmlSerializer ser = new XmlSerializer(typeof(Book));
TextWriter writer = new StreamWriter("INPUT-Test-004.xml");
BookObject.Title = "Practical LotusScript";
BookObject.ISBN = "1884777767 ";
BookObject.Publisher = "Manning Publications";
BookObject.Author = "Liming";
ser.Serialize(writer, BookObject);
writer.Close();
}

以上将一个Book对象序列化到一个xml文件中,现在我想问:
1、假如我只知道一个XML文件是将某个类序列化后的结果,不知道类名,我现在想反序列化这个xml文件成为一个对象,

能不能这样写:
XmlSerializer ser = new XmlSerializer(typeof(object));
System.IO.FileStream fs = new System.IO.FileStream(@"D:\temp\SOAPTest\DataPath\INPUT-Test-004.xml", FileMode.Open);
System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(fs);
object BookObject = (object)(ser.Deserialize(reader));


反序列化成一个object类型的对象,然后用反射的方法取得这个类的类名和字段和字段值?

如果可以的话,为何在执行到object BookObject = (object)(ser.Deserialize(reader)); 这一句时会出错。
...全文
164 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mfkygazb 2005-01-10
  • 打赏
  • 举报
回复
up
linfengcyl 2004-12-24
  • 打赏
  • 举报
回复
你可以将类名-XML文件名列表存在别的地方,比如说在DB或另一个XML文件中,对象是可以由名字生成的.自己查MSDN.
saucer 2004-12-24
  • 打赏
  • 举报
回复
使用property的好处在于你可以验证用户设置的数据,或改变内部存储数据的方式,但如果你的对象是个纯数据结构,没什么逻辑(方法)的话,用公共变量就可以
kong19 2004-12-24
  • 打赏
  • 举报
回复
up
linuxyf 2004-12-24
  • 打赏
  • 举报
回复
如果我要写一个可以序列化成Xml得数据bean,我是用公共属性保存数据还是用公共字段保存好一些?
linuxyf 2004-12-24
  • 打赏
  • 举报
回复
saucer(思归)大哥,
XML 序列化是将对象的公共属性和字段转换为序列格式(这里是指 XML)以便存储或传输的过程。

属性定义成公共的和公共字段有什么区别,公共字段也可以直接访问,还用得着定义成属性吗?定义成属性还得写get,set?
saucer 2004-12-24
  • 打赏
  • 举报
回复
好好想想,XmlSerializer是在System.Xml.dll assembly里,跟你的程序一点没关系,如果你不传入一个Type对象,它看到一个<Book>,怎么知道该生成一个什么对象?到处去找哪里有个Book类么?而且,class Book 也不一定会生成<Book>的,假如你改变其Attribute的话
linuxyf 2004-12-24
  • 打赏
  • 举报
回复
好像类名已经存在在序列化的这个文件中了:
<?xml version="1.0" encoding="utf-8"?>
<Book xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Title>Practical LotusScript</Title>
<Author>Tony</AuthorObject>
<ISBN>1884777767 </ISBN>
<RetailPrice>43.95</RetailPrice>
<Publisher>Manning Publications</Publisher>
</Book>


那我在反序列化的时候是不是先要从这个文件中取出类名???这个类名就是根节点的名字吗?
saucer 2004-12-24
  • 打赏
  • 举报
回复
the deserializer needs to know what type of object to instantiate, if you don't pass a type in, how does it know it should create a Book object if it sees <Book>?

think about it, XmlSerializer lives in System.Xml.dll assembly, it does not know the type "Book" exists, should it search through your AppDomain or your hard disk to find the right assembly which contains the type Book?

static void Main(string[] args)
{
string sFile = "INPUT-Test-004.xml";
Book BookObject = new Book();
XmlSerializer ser = new XmlSerializer(typeof(Book));
TextWriter writer = new StreamWriter(sFile);
BookObject.Title = "Practical LotusScript";
BookObject.ISBN = "1884777767 ";
BookObject.Publisher = "Manning Publications";
BookObject.Author = "Liming";
ser.Serialize(writer, BookObject);
writer.Close();

Console.Write("enter to read the data");
Console.ReadLine();

XmlSerializer ser2 = new XmlSerializer(typeof(Book));
System.IO.FileStream fs2 = new System.IO.FileStream(sFile, FileMode.Open);
System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(fs2);
Book BookObject2 = (Book)(ser2.Deserialize(reader));

fs2.Close();

Console.WriteLine(BookObject2.Author);
}
cppTrier 2004-12-23
  • 打赏
  • 举报
回复
不可以

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧