XML的序列化与反序列化
问题:什么是序列化?
序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。
在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
- 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
- 在网络上传送对象的字节序列。
为什么要做序列化和反序列化?
.Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化。
我们可以把对象序列化为不同的格式,比如说,Json序列化、XML序列化、二进制序列化、SOAP序列化等
简单的Xml序列化代码
class XML
{
static void Main(string[] args)
{
int i = 10;
//声明Xml序列化对象实例serializer
XmlSerializer serializer = new XmlSerializer(typeof(int));
//执行序列化并将序列化结果输出到控制台
serializer.Serialize(Console.Out, i);
Console.Read();
}
}
注意引用命名空间System.Xml.Serialization
输出结果如下:
<?xml version="1.0" encoding="gb2312"?>
<int>10</int>
将上述xml反序列化
static void Main(string[] args)
{
using (StringReader reader = new StringReader(@"<?xml version=""1.0"" encoding=""gb2312""?><int>10</int>"))
{
XmlSerializer serializer = new XmlSerializer(typeof(int));
//反序列化,并将结果赋值给i
int i = (int)serializer.Deserialize(reader);
//输出结果
Console.WriteLine("i= " + i);
Console.Read();
}
}
运行结果
i=10
目的:将数据库的数据写入到xml文件中
首先遇到了问题:
C#文件读取写入操作
相关连接:https://blog.csdn.net/unclebober/article/details/86242690
想法:数据库查找数据生成DataTable,将DataTable以xml格式输出到xml文件中
但是datatable如何转换为xml格式,目前被这个给难住了,还在研究中。
查阅文档发现
DataTable.WriteXml 方法
以XML形式写入DataTable的当前内容。
抱着试一试的心态,我加入了如下的代码:
DataSet ds = new DataSet();//Dataset contains a lot of table
da.Fill(ds);
ds.WriteXml("write.xml", XmlWriteMode.WriteSchema);
DataTable dt = ds.Tables[0];
ds.WriteXml(@"D:\ck.xml");//WriteXml Method
然后发现在D盘下的确生成了一个xml文件,并且里面的内容也确实是xml格式的。
所以,可以通过DataTable.WriteXml 方法将DataTable中的内容以xml形式写入的。
发现了一个问题,就是xml文件中根节点和第一个子节点的名称不是Students和Student
将上面第一句改为 DataSet ds = new DataSet(“Students”);
根节点的问题解决了,但是子节点的问题还在。
反序列化
——将xml反序列化为集合输出
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace _01XMLSerialize
{
class Program
{
public static List<UserInfo> list = new List<UserInfo>()
{
new UserInfo()
{
Id = 1,
UserName = "张三",
UserPass = "FDASDFAS",
Email = "zhangsan@163.com",
RegTime = DateTime.Now
},
new UserInfo()
{
Id = 2,
UserName = "李四",
UserPass = "FDASDFAS",
Email = "lisi@163.com",
RegTime = DateTime.Now
},
new UserInfo()
{
Id = 3,
UserName = "王五",
UserPass = "FDASDFAS",
Email = "wangwu@163.com",
RegTime = DateTime.Now
},
new UserInfo()
{
Id = 4,
UserName = "赵六",
UserPass = "FDASDFAS",
Email = "zhaoliu@163.com",
RegTime = DateTime.Now
},
new UserInfo()
{
Id = 5,
UserName = "田七",
UserPass = "FDASDFAS",
Email = "tianqi@163.com",
RegTime = DateTime.Now
},
new UserInfo()
{
Id = 6,
UserName = "王八",
UserPass = "FDASDFAS",
Email = "wangba@163.com",
RegTime = DateTime.Now
}
};
static void Main(string[] args)
{
//foreach(UserInfo usr in list)
//{
// Console.WriteLine(usr);
//}
//序列化对象生成文件
WriteSingleXml();
//反序列化文件生成对象
ReadListXml();
Console.ReadKey();
}
/// <summary>
/// 从XML文件中反序列化对象
/// </summary>
public static void ReadListXml()
{
//反序列化文件
Console.WriteLine("反序列化XML文件为集合");
var reader = new XmlSerializer(typeof(List<UserInfo>));
using (var fs = File.OpenRead(@"D:\UserInfo.xml"))
{
var result = reader.Deserialize(fs) as List<UserInfo>;
foreach (UserInfo item in list)
{
//Console.WriteLine(item);
Console.WriteLine(Convert.ToString(item.Id)+" "+item.UserName+" "+item.UserPass+" "+item.Email);
}
//result.ForEach(Console.WriteLine);
}
Console.WriteLine("反序列化成功");
}
/// <summary>
/// 序列化对象到XML文件
/// </summary>
public static void WriteSingleXml()
{
//序列化集合为xml文件
Console.WriteLine("序列化集合为XML文件");
var reader = new XmlSerializer(typeof(List<UserInfo>));
//写入文件
using (var fs = File.OpenWrite(@"D:\UserInfo.xml"))
{
reader.Serialize(fs, list);
}
Console.WriteLine("写入成功");
}
}
}