oracle xml 序列化,XML序列化和反序列化

在谈XML序列化之前,我们先来说说序列化。

序列化名词解释:序列化是将对象状态转换为可保持或传输的格式的过程。

与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。这就是序列化的意义所在。

我们可以把对象序列化为不同的格式,比如说,Json序列化、XML序列化、二进制序列化、SOAP序列化等,以上这些不同的格式也都是为了适应具体的业务需求。

在本篇文章中,我们就来分析一下XML的序列化和反序列化。我们先来看一个XML文件:

小明

16

123

借的书1

小红

18

456

借的书2

789

借的书3

在这个文件中BaseInfo为该XML的跟节点,它的里面由多个Person节点组成,在Person节点中又包括Name、Age、Books节点,Books节点中又由多个Book组成,在Book中又包括ISBN和Title。

下面首先我们要做的是创建与该XML相对应的对象,然后把对象转换为上述XML(序列化),或者把上述XML转换为对象(反序列化)。下面的例子中只是把XML存到本地,再从本地读取出来,如果需要在网络中传输,应该添加Serializable属性,我们先来创建对象。

using System.Xml.Serialization;

public class BaseInfo

{

List perList = new List();

[XmlElement(ElementName="Person")]

public List PerList

{

get { return perList; }

set { perList = value; }

}

}

使用XML序列化需要引入命名空间System.Xml.Serialization。我们创建的类名称为BaseInfo,这里与XML的跟节点需要对应,当然我们也可以指定该类转换为XML时映射成的名称,这里可以使用XmlRoot中的ElementName来指定它的名称,就像该类中的属性PerList那样应用,当然你也可以使用比较省事的方法,类的名称和XML节点的名称相同即可,就像该例子中一样。在BaseInfo类中,我们维护了一个PerList它是一个Person对象的集合,当然这个属性的名称并不与XML文件中的对应,所以要更改它的名称为Person。

好,接下来我们看看Person类:

using System.Xml.Serialization;

public class Person

{

string name;

int age;

List bookList=new List();

/// 

/// 必须有默认的构造函数

/// 

public Person()

{ }

public Person(string name, int age)

{

this.name = name;

this.age = age;

}

public string Name

{

get { return name; }

set { name = value; }

}

public int Age

{

get { return age; }

set { age = value; }

}

[XmlElement(ElementName = "Books")]

public List BookList

{

get { return bookList; }

set { bookList = value; }

}

}

在该类中有Name和Age,还有维护了一个Books对象。

我们再来看看Books:

using System.Xml.Serialization;

public class Books

{

List bookList = new List();

[XmlElement(ElementName = "Book")]

public List BookList

{

get { return bookList; }

set { bookList = value; }

}

}

Books的作用就像是一个过渡的类,只为了与XML中的节点Books对应,在该类中维护了Book类的对象集合。

那么,最后我们来看Book类:

using System.Xml.Serialization;

public class Book

{

string isbn;

string title;

public Book() { }

public Book(string isbn, string title)

{

this.isbn = isbn;

this.title = title;

}

public string ISBN

{

get { return isbn; }

set { isbn = value; }

}

public string Title

{

get { return title; }

set { title = value; }

}

}

好了,这样我们需要的类也就都创建完了,虽说创建类的过程有些繁杂,但是有了这些类,我们也就不用一个一个处理XML的节点了。我们创建一个简单的控制台程序,在里面添加两个处理方法,第一个是序列化方法:

public static void xmlSerialize()

{

Book b1 = new Book("111","书1");

Book b2 = new Book("222","书2");

Book b3 = new Book("333","书3");

Books bs1 = new Books();

Books bs2 = new Books();

bs1.BookList.Add(b1);

bs1.BookList.Add(b2);

bs2.BookList.Add(b3);

Person p1 = new Person("张三", 11);

Person p2 = new Person("李四", 22);

p1.BookList.Add(bs1);

p2.BookList.Add(bs2);

BaseInfo baseInfo = new BaseInfo();

baseInfo.PerList.Add(p1);

baseInfo.PerList.Add(p2);

StringWriter sw = new StringWriter();

//创建XML命名空间

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

ns.Add("","");

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

serializer.Serialize(sw, baseInfo, ns);

sw.Close();

Console.Write(sw.ToString());

}

调用该方法运行效果:

dc0d0e144c6db1667d46476b5b8b3a12.png

第二个是反序列化方法:

public static void xmlDeserialize()

{

//xml来源可能是外部文件,也可能是从其他系统获得

FileStream file = new FileStream(@"http://www.cnblogs.com/info.xml", FileMode.Open, FileAccess.Read);

XmlSerializer xmlSearializer = new XmlSerializer(typeof(BaseInfo));

BaseInfo info = (BaseInfo)xmlSearializer.Deserialize(file);

file.Close();

foreach (Person per in info.PerList)

{

Console.WriteLine("人员:");

Console.WriteLine(" 姓名:" + per.Name);

Console.WriteLine(" 年龄:" + per.Age);

foreach (Books b1 in per.BookList)

{

foreach (Book b in b1.BookList)

{

Console.WriteLine(" 书:");

Console.WriteLine("     ISBN:" + b.ISBN);

Console.WriteLine("     书名:" + b.Title);

}

}

}

}

调用该方法运行效果:

0752d322cc06b83d2100e2e7e83b3044.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值